XYFangKuaiChaXiaoJi.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758
  1. #include "global.h"
  2. #include "typedefine.h"
  3. #if 0//XIN_YE_MACHINE
  4. /**************************************
  5. ** 函数名称:void ChaXiaoJi(void)
  6. ** 函数功能:方块插稍机动作函数
  7. ** 输入输出说明:
  8. 输入:
  9. X0 插销启动
  10. X1 停止开关
  11. X2 方块启动
  12. X3 手动钩针
  13. X4 安全门
  14. X5 方块.插销选择
  15. X6 手动给料
  16. X7 手动夹料
  17. X010 手动送料
  18. X011 手动下冲
  19. X12 过链接近开关
  20. X13 下冲感应接近开关
  21. X14 夹插销光电开关
  22. X15 夹方块光电开关
  23. X16 送插销到位磁感
  24. X17 退送插销到位磁感
  25. X20 送方块到位磁感
  26. X021 退送方块到位磁感
  27. X022 压带磁感
  28. X023 给插销磁感
  29. X024 给方块磁感
  30. X025 冲针选择
  31. X026 冲针保护
  32. X27 打单边
  33. 输出:
  34. Y0 离合器
  35. Y1 计数
  36. Y2 插销运行指示 (触摸屏时为振动盘)
  37. Y3 方块运行指示 (触摸屏时为警告蜂鸣器)
  38. Y4 方块垫块电磁阀
  39. Y5 压带电磁阀
  40. Y6 下冲电磁阀
  41. Y7 插销垫块电磁阀
  42. Y10 给插销电磁阀
  43. Y11 夹插销电磁阀
  44. Y12 送插销电磁阀
  45. Y13 送方块电磁阀
  46. Y14 夹方块电磁阀
  47. Y017 给方块电磁阀
  48. Y016 勾针电磁阀
  49. Y017 冲子选择电磁阀
  50. D0 给插销(方块)到位后延时退回
  51. D1 送插捎(方块)到位夹打开延时退回
  52. D2 下冲输出时间
  53. D3 给料次数
  54. D4 给料故障后下一次给料时间
  55. D5 给料到前点的最长时间
  56. D6 延时停离合
  57. D7 延时上勾针
  58. D8 普通方块插销设置(2.55)
  59. 上下拉方块插销设置(0.55)
  60. D9 加速时间
  61. D10 起动速度
  62. D11 最高速度
  63. D12 下冲感应方式(0 老方式 1 新常亮方式)
  64. ***************************************/
  65. #define bStopOver cFangKuaiRunBit.bits.b0
  66. #define bStopXiao cFangKuaiRunBit.bits.b1
  67. #define bStopFang cFangKuaiRunBit.bits.b2
  68. #define bStopXiaCong cFangKuaiRunBit.bits.b3
  69. #define bXiaCong cFangKuaiRunBit.bits.b4
  70. #define bGeiXiao cFangKuaiRunBit.bits.b5
  71. #define bGeiFang cFangKuaiRunBit.bits.b6
  72. #define IN_EN 1
  73. #define IN_DIS 2
  74. #define OUT_EN 3
  75. #define OUT_DIS 4
  76. unsigned char FKCX_cReady,FKCX_cHalfRun,FKCX_cYaDai,FKCX_cSelectXiaChong,FKCX_YaDaiError,FKCX_cXiaChongStep = 0,FKCX_bRunning,FKCX_bStop;
  77. unsigned long cErrorTime,FKCX_cErrorTime1,FKCX_cStartKeyDelay,FKCX_cTotal,FKCX_cTestNum,FKCX_cErrorTime2;
  78. unsigned char cGeiLiaoNum,YaDaiError;
  79. unsigned short FKCX_cCountTime;
  80. unsigned char cReady,cHalfRun,cYaDai,cSelectXiaChong,YaDaiError;
  81. unsigned long FKCX_JiaXiao(unsigned long En_Dis);
  82. unsigned long FKCX_SongXiao(unsigned long En_Dis);
  83. unsigned long FKCX_Motor(unsigned long En_Dis);
  84. unsigned long FKCX_JiaFang(unsigned long En_Dis);
  85. unsigned long FKCX_SongFang(unsigned long En_Dis);
  86. unsigned long cProSpTime;
  87. unsigned short cStopOver;
  88. void FKCX_ManualAciton(void);
  89. void FKCX_XiaChongStep(void);
  90. void FK_Auto_Con_XY(void);
  91. byte_bits_t cFangKuaiRunBit;
  92. //故障报警
  93. void FKCX_SetAlarmCode(unsigned alarm_code)
  94. {
  95. SetAlarmCode(FKCX_ALARM_ADDR,alarm_code);
  96. FKCX_bStop = 1;
  97. }
  98. void FKCX_InitAction(void)
  99. {
  100. CalFreqTab_X_Free(50);
  101. XGearRatio = 1;
  102. YGearRatio = 1;
  103. FKCX_SETDR();
  104. }
  105. //夹销.给销动作
  106. void JiaXiao_XY(void)
  107. {
  108. switch(cStepMByte3) //离合器起动
  109. {
  110. case 0:
  111. break;
  112. case 1:
  113. if(X17) //退送插销到位磁感
  114. {
  115. cStepMByte3 = 2;
  116. SETQ10; //给插销打开
  117. SETQ11; //夹插销打开
  118. FKCX_cErrorTime1 = dwTickCount + (unsigned long)user_datas[5]*10;
  119. cDelayTime5 = dwTickCount + (unsigned long)1200;
  120. }
  121. else
  122. CLRQ10; //给插销关
  123. CLRQ12; //送稍电磁阀
  124. break;
  125. case 2: //给销到位
  126. if(X023) //给销到位
  127. {
  128. if(X23_UP)
  129. cDelayTime5 = dwTickCount + (unsigned long)35;
  130. else if(dwTickCount >= cDelayTime5)
  131. {
  132. CLRQ11; //夹插销夹
  133. cDelayTime5 = dwTickCount + (unsigned long)45;
  134. cStepMByte3 = 30;
  135. }
  136. }
  137. else if(dwTickCount >= FKCX_cErrorTime1)
  138. {
  139. CLRQ11; //夹插销夹
  140. CLRQ10; //给插销退回
  141. cGeiLiaoNum++;
  142. if(cGeiLiaoNum >= user_datas[3]) //给料次数到卡料警告
  143. {
  144. bStop = 1;
  145. cGeiLiaoNum = 0;
  146. //cMidleCoil[5] |= (1<<2); //插稍给料出错
  147. user_datas[75] = ActionPage;
  148. user_datas[100] = 3; //给料出错显示
  149. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  150. user_datas[101] = 0;
  151. }
  152. else
  153. {
  154. cStepMByte3 = 4;
  155. }
  156. }
  157. break;
  158. case 30:
  159. if(dwTickCount >= cDelayTime5)
  160. {
  161. CLRQ10; //给插销退回
  162. cStepMByte3 = 3;
  163. cDelayTime5 = dwTickCount + (unsigned long)user_datas[0]*10 + 30;
  164. }
  165. break;
  166. case 3: //给料到位成功
  167. if(dwTickCount >= cDelayTime5)
  168. {
  169. CLRQ11; //夹插销夹
  170. CLRQ10; //给插销退回
  171. if(!X023)
  172. {
  173. // !X04 //不用料自动运行
  174. if(!bGeiXiao && (user_datas[90] != 55)) //没料
  175. {
  176. cStepMByte3 = 0;
  177. cGeiLiaoNum++;
  178. if(cGeiLiaoNum >= user_datas[3]) //送三次没料
  179. {
  180. bStop = 1;
  181. cGeiLiaoNum = 0;
  182. //cMidleCoil[5] |= (1<<2); //插稍给料出错
  183. user_datas[75] = ActionPage;
  184. user_datas[100] = 5; //给料出错显示
  185. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  186. user_datas[101] = 0;
  187. }
  188. else
  189. {
  190. cStepMByte3 = 4;
  191. }
  192. }
  193. else
  194. {
  195. cStepMByte3 = 0;
  196. cGeiLiaoNum = 0;
  197. }
  198. }
  199. }
  200. break;
  201. case 4: //给料不成功
  202. if(!X023)
  203. {
  204. cStepMByte3 = 5;
  205. cDelayTime5 = dwTickCount + (unsigned long)user_datas[4]*10;
  206. }
  207. break;
  208. case 5:
  209. if((dwTickCount >= cDelayTime5))
  210. {
  211. if(!bGeiXiao) //!X14
  212. {
  213. cStepMByte3 = 2;
  214. SETQ10; //给插销打开
  215. SETQ11; //夹插销打开
  216. FKCX_cErrorTime1 = dwTickCount + (unsigned long)user_datas[5]*10;
  217. cDelayTime5 = dwTickCount + (unsigned long)1200;
  218. }
  219. else //其实已经有料
  220. {
  221. cStepMByte3 = 0;
  222. /* bStop = 1;
  223. cGeiLiaoNum = 0;
  224. //cMidleCoil[5] |= (1<<2); //插稍给料出错
  225. user_datas[75] = ActionPage;
  226. user_datas[100] = 3; //给料出错显示
  227. cMidleCoil[0] &= ~(1<<15); //M15
  228. user_datas[101] = 0;
  229. */
  230. }
  231. }
  232. break;
  233. }
  234. }
  235. //送销动作
  236. void SongXiao_XY(void)
  237. {
  238. switch(cStepMByte3)
  239. {
  240. case 0:
  241. break;
  242. case 1:
  243. FKCX_cErrorTime1 = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  244. //X04
  245. if((bGeiXiao) || (user_datas[90] == 55)) //方块
  246. {
  247. SETQ12; //送销打开
  248. cStepMByte3 = 2;
  249. }
  250. break;
  251. case 2: //送销到位
  252. if((X16) && (!X17))
  253. {
  254. cStepMByte3 = 3;
  255. cDelayTime5 = dwTickCount + (unsigned long)20;
  256. }
  257. else if(dwTickCount >= FKCX_cErrorTime1) //送销不到位故障
  258. {
  259. // bStop = 1;
  260. //cMidleCoil[5] |= (1<<4); //插稍送料不到位
  261. user_datas[75] = ActionPage;
  262. user_datas[100] = 7; //插稍送料不到位
  263. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  264. user_datas[101] = 0;
  265. }
  266. break;
  267. case 3:
  268. if(dwTickCount >= cDelayTime5)
  269. {
  270. cStepMByte3 = 4;
  271. SETQ11; //夹插销打开
  272. cDelayTime5 = dwTickCount + (unsigned long)user_datas[1]*10;
  273. }
  274. break;
  275. case 4:
  276. if(dwTickCount >= cDelayTime5)
  277. {
  278. cStepMByte3 = 5;
  279. CLRQ12; //退送插销
  280. bStopXiaCong = 1;
  281. FKCX_cErrorTime1 = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  282. }
  283. break;
  284. case 5:
  285. if((X17) && (!X16))
  286. {
  287. cStepMByte3 = 6;
  288. CLRQ11; //夹插销关
  289. cDelayTime5 = dwTickCount + (unsigned long)150;
  290. }
  291. else if(dwTickCount >= FKCX_cErrorTime1) //退送出错警告
  292. {
  293. // bStop = 1;
  294. //cMidleCoil[5] |= (1<<6); //插稍送料退不到位
  295. user_datas[75] = ActionPage;
  296. user_datas[100] = 9; //插稍送料退不到位
  297. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  298. user_datas[101] = 0;
  299. }
  300. break;
  301. case 6:
  302. if(!bGeiXiao) // !X04
  303. {
  304. cStepMByte3 = 0;
  305. bStopXiaCong = 1;
  306. }
  307. else if(dwTickCount >= cDelayTime5) //带料出来警告
  308. {
  309. bStop = 1;
  310. bStopXiaCong = 0;
  311. //cMidleCoil[5] |= (1<<9); //插稍带料退出
  312. user_datas[75] = ActionPage;
  313. user_datas[100] = 11; //插稍带料退出
  314. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  315. user_datas[101] = 0;
  316. }
  317. break;
  318. }
  319. }
  320. //夹方块.给方块动作
  321. void JiaFang_XY(void)
  322. {
  323. switch(cStepMByte4)
  324. {
  325. case 0:
  326. break;
  327. case 1:
  328. if(X021)
  329. {
  330. cStepMByte4 = 2;
  331. SETQ17; //给方块打开
  332. SETQ14; //夹方块打开
  333. FKCX_cErrorTime2 = dwTickCount + (unsigned long)user_datas[5]*10;
  334. cDelayTime6 = dwTickCount + (unsigned long)1200;
  335. }
  336. else
  337. CLRQ17;
  338. CLRQ13;
  339. break;
  340. case 2: //给方块到位
  341. if(X024)
  342. {
  343. if(X24_UP)
  344. {
  345. cDelayTime6 = dwTickCount + (unsigned long)35;
  346. }
  347. else if(dwTickCount >= cDelayTime6)
  348. {
  349. CLRQ14; //夹方块夹
  350. CLRQ17; //给方块退回
  351. cStepMByte4 = 3;
  352. cDelayTime6 = dwTickCount + (unsigned long)user_datas[0]*10 + 30;
  353. }
  354. }
  355. else if(dwTickCount >= FKCX_cErrorTime2)
  356. {
  357. CLRQ14; //夹方块夹
  358. CLRQ17; //给方块退回
  359. cStepMByte4 = 0;
  360. cGeiLiaoNum++;
  361. if(cGeiLiaoNum >= user_datas[3]) //给料三次错误
  362. {
  363. bStop = 1;
  364. cGeiLiaoNum = 0;
  365. //cMidleCoil[5] |= (1<<3); //方块给料出错
  366. user_datas[75] = ActionPage;
  367. user_datas[100] = 4; //方块出错显示
  368. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  369. user_datas[101] = 0;
  370. }
  371. else
  372. {
  373. cStepMByte4 = 4;
  374. }
  375. }
  376. break;
  377. case 3: //已给料到前面
  378. if(dwTickCount >= cDelayTime6)
  379. { // !X15 //没带空打
  380. if((!bGeiFang) && (user_datas[90] != 55)) //没料
  381. {
  382. cGeiLiaoNum++;
  383. if(cGeiLiaoNum >= user_datas[3]) //没料三次警告
  384. {
  385. bStop = 1;
  386. cGeiLiaoNum = 0;
  387. //cMidleCoil[5] |= (1<<3); //方块给料出错
  388. user_datas[75] = ActionPage;
  389. user_datas[100] = 6; //方块出错显示
  390. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  391. user_datas[101] = 0;
  392. }
  393. else
  394. {
  395. cStepMByte4 = 4;
  396. }
  397. }
  398. else
  399. {
  400. cStepMByte4 = 0; //完成
  401. cGeiLiaoNum = 0;
  402. }
  403. }
  404. break;
  405. case 4://出错退回
  406. if(!X024)
  407. {
  408. cStepMByte4 = 5;
  409. cDelayTime6 = dwTickCount + (unsigned long)user_datas[4]*10;
  410. }
  411. break;
  412. case 5:
  413. if((dwTickCount >= cDelayTime6))
  414. { //!X15
  415. if(!bGeiFang)
  416. {
  417. cStepMByte4 = 2;
  418. SETQ17; //给插销打开
  419. SETQ14; //夹插销打开
  420. FKCX_cErrorTime2 = dwTickCount + (unsigned long)user_datas[5]*10;
  421. cDelayTime6 = dwTickCount + (unsigned long)1200;
  422. }
  423. else
  424. {
  425. cStepMByte4 = 0;
  426. /* bStop = 1;
  427. cGeiLiaoNum = 0;
  428. //cMidleCoil[5] |= (1<<3); //方块给料出错
  429. user_datas[75] = ActionPage;
  430. user_datas[100] = 4; //方块出错显示
  431. cMidleCoil[0] &= ~(1<<15); //M15
  432. user_datas[101] = 0;
  433. */
  434. }
  435. }
  436. break;
  437. }
  438. }
  439. //送方块动作
  440. void SongFang_XY(void)
  441. {
  442. switch(cStepMByte4)
  443. {
  444. case 0:
  445. break;
  446. case 1: //X15
  447. if((bGeiFang) || (user_datas[90] == 55))
  448. {
  449. cStepMByte4 = 2;
  450. SETQ13; //送方块打开
  451. FKCX_cErrorTime2 = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  452. }
  453. break;
  454. case 2: //送销到位
  455. if((X20) && (!X021))
  456. {
  457. cStepMByte4 = 3;
  458. cDelayTime6 = dwTickCount + (unsigned long)20;
  459. }
  460. else if(dwTickCount >= FKCX_cErrorTime2) //送销不到位故障
  461. {
  462. // bStop = 1;
  463. //cMidleCoil[5] |= (1<<5); //方块送料不到位
  464. user_datas[75] = ActionPage;
  465. user_datas[100] = 8; //方块送料不到位
  466. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  467. user_datas[101] = 0;
  468. }
  469. break;
  470. case 3:
  471. if(dwTickCount >= cDelayTime6)
  472. {
  473. cStepMByte4 = 4;
  474. SETQ14; //夹方块打开
  475. cDelayTime6 = dwTickCount + (unsigned long)user_datas[1]*10;
  476. }
  477. break;
  478. case 4:
  479. if(dwTickCount >= cDelayTime6)
  480. {
  481. cStepMByte4 = 5;
  482. CLRQ13; //退送方块
  483. bStopXiaCong = 1;
  484. FKCX_cErrorTime2 = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  485. }
  486. break;
  487. case 5:
  488. if((X021) && (!X20))
  489. {
  490. cStepMByte4 = 6;
  491. CLRQ14; //夹方块关
  492. cDelayTime6 = dwTickCount + (unsigned long)150;
  493. }
  494. else if(dwTickCount >= FKCX_cErrorTime2) //退送方块出错警告
  495. {
  496. // bStop = 1;
  497. //cMidleCoil[5] |= (1<<7); //方块送料退不到位
  498. user_datas[75] = ActionPage;
  499. user_datas[100] = 10; //方块送料退不到位
  500. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  501. user_datas[101] = 0;
  502. }
  503. break;
  504. case 6:
  505. if(!bGeiFang)//!X15
  506. {
  507. cStepMByte4 = 0;
  508. bStopXiaCong = 1;
  509. }
  510. else if(dwTickCount >= cDelayTime6) //带料出来警告
  511. {
  512. bStop = 1;
  513. bStopXiaCong = 0;
  514. //cMidleCoil[5] |= (1<<10); //方块带料退出
  515. user_datas[75] = ActionPage;
  516. user_datas[100] = 12; //方块带料退出
  517. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  518. user_datas[101] = 0;
  519. }
  520. break;
  521. }
  522. }
  523. void Start_Xiao_XY(unsigned char ch)
  524. {
  525. FKCX_CLRDR();
  526. cHalfRun = ch;
  527. cProSpTime = dwTickCount;
  528. M00 = 0;M01 = 0;//cMidleCoil[0] &= ~((1<<0) | (1<<1));
  529. M24 = 0;//cMidleCoil[1] &= ~(1<<8); //M24
  530. user_datas[100] = 0;
  531. bStopXiao = 0;
  532. bStopOver = 0;
  533. FKCX_bRunning = 1;
  534. // if(cHMI_Test == 0)
  535. SETQ02; //运行指示灯
  536. cStepMByte2 = 0;
  537. cStepMByte3 = 0;
  538. cGeiLiaoNum = 0;
  539. CLRQ04;
  540. CLRQ07;
  541. if(bStopXiaCong != 0) //
  542. {
  543. cStepMByte = 4;
  544. cStepMByte4 = 1; //给方块开始
  545. if(user_datas[8] != 55) //不是双拉机型
  546. {
  547. SETQ07; //垫片
  548. SETQ06; //下冲
  549. cDelayTime1 = dwTickCount + (unsigned long)user_datas[2]*10;
  550. cErrorTime = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  551. M14 = 0;//cMidleCoil[0] |= (1<<14); //M14
  552. }
  553. bStopXiao = 0;
  554. bStopXiaCong = 0;
  555. cYaDai = 0;
  556. }
  557. else
  558. cStepMByte = 1; //从插销开始
  559. // if(X02)
  560. // cYaDai = 1;
  561. }
  562. void Start_Fang_XY(unsigned char ch)
  563. {
  564. FKCX_CLRDR();
  565. cHalfRun = ch;
  566. cProSpTime = dwTickCount;
  567. M00 = 0;M01 = 0;//cMidleCoil[0] &= ~((1<<0) | (1<<1));
  568. M25 = 0;//cMidleCoil[1] &= ~(1<<9); //M25
  569. bStopOver = 0;
  570. FKCX_bRunning = 1;
  571. SETQ02; //运行指示
  572. cStepMByte3 = 0;
  573. cStepMByte2 = 0;
  574. cGeiLiaoNum = 0;
  575. bStopFang = 1;
  576. user_datas[100] = 0;
  577. //之前已经送好料 直接下冲
  578. CLRQ04;
  579. CLRQ07; //
  580. if((bStopXiaCong) != 0)
  581. {
  582. cStepMByte4 = 0;
  583. cStepMByte = 7;
  584. SETQ06; //下冲
  585. SETQ04; //方块垫片
  586. cDelayTime1 = dwTickCount + (unsigned long)user_datas[2]*10;
  587. cErrorTime = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  588. M14 = 0;//cMidleCoil[0] |= (1<<14); //M14
  589. cYaDai = 0;
  590. }
  591. else
  592. {
  593. cStepMByte = 5; //从方块开始
  594. if(bGeiFang) //X15
  595. cStepMByte4 = 0; //已有方块给方块
  596. else
  597. cStepMByte4 = 1; //已经有料
  598. }
  599. // if(X02)
  600. // cYaDai = 1;
  601. }
  602. void FKCX_ManualAciton(void)
  603. {
  604. unsigned long Y14_flg = 0;
  605. unsigned long Y14_delay;
  606. unsigned long Y11_flg = 0;
  607. unsigned long Y11_delay;
  608. static unsigned long in_delay;
  609. //下冲时判断是否出错
  610. //
  611. //工作条件
  612. if(cReady != 0)
  613. {
  614. //按起动 全自动 单条
  615. if(((X00_UP) || M00 || M01))
  616. {
  617. //不是方块停止 夹方块光电
  618. if(!bStopFang && !bGeiFang)// && (X20 || (cHMI_Test)))
  619. {
  620. if(M01 || X02_UP)
  621. Start_Xiao_XY(2); //单条
  622. else
  623. Start_Xiao_XY(0); //全自动
  624. }
  625. else if(!bStopXiao && bStopFang)// && (X20 || (cHMI_Test))) //方块启动
  626. {
  627. if(M01 || X02_UP)
  628. Start_Fang_XY(2); //单条
  629. else
  630. Start_Fang_XY(0); //全自动
  631. }
  632. M00 = 0;M01 = 0;//cMidleCoil[0] &= ~((1<<0) | (1<<1)); //M0 = 0,M1 = 0;
  633. }
  634. else if(X022) //压带到位(要先压带)
  635. {
  636. if(X02_UP)
  637. {
  638. if(X05) //插销全循环
  639. {
  640. Start_Xiao_XY(2); //全循环方式
  641. }
  642. else //方块全循环
  643. {
  644. Start_Fang_XY(2); //全循环方式
  645. }
  646. }
  647. else
  648. {
  649. if(M24) //插销半循环
  650. {
  651. Start_Xiao_XY(1); //半循环方式
  652. }
  653. else if(M25) //方块半循环
  654. {
  655. Start_Fang_XY(1); //半循环方式
  656. }
  657. }
  658. }
  659. else
  660. {
  661. M24 = 0;M25 = 0;//cMidleCoil[1] &= ~((1<<8) | (1<<9)); //M24 = 0 ;M25 = 0;
  662. }
  663. }
  664. else
  665. {
  666. M00 = 0;M01 = 0;//cMidleCoil[0] &= ~((1<<0) | (1<<1)); //M0 = 0,M1 = 0;
  667. M24 = 0;M25 = 0;//cMidleCoil[1] &= ~((1<<8) | (1<<9)); //M24 = 0,M25 = 0;
  668. }
  669. //手动下冲
  670. if(X11_UP || M05)
  671. {
  672. M05 = 0;//cMidleCoil[0] &= ~(1<<5);
  673. if(dwTickCount >= cDelayTime7)
  674. {
  675. if(X011)
  676. cDelayTime7 = dwTickCount + (unsigned long)0;
  677. else
  678. cDelayTime7 = dwTickCount + (unsigned long)10;
  679. // 送插销 送方块 退送插销到位 退送方块到位
  680. if((!Y12) && (!Y13) && (X17) && (X021)
  681. //勾针电磁阀 压带磁感 上升延 左右埑片 单板方式
  682. &&(!Y016) && (X022)&& (Y004 || Y007))
  683. {
  684. SETQ06; //下冲电磁阀
  685. cDelayTime1 = dwTickCount + (unsigned long)user_datas[2]*10;
  686. cErrorTime = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  687. M14 = 1;//cMidleCoil[0] |= (1<<14); //M14
  688. }
  689. else //下冲条件不满足警告
  690. {
  691. M15 = 0;//cMidleCoil[0] &= ~((1<<15)); //M15
  692. //cMidleCoil[5] |= (1<<12); //不用
  693. user_datas[75] = OutPage;
  694. if(Y12) //送稍
  695. {
  696. user_datas[100] = ERY12; //Y12 无输出
  697. user_datas[101] = OUT_DIS;
  698. }
  699. else if(Y13) //送方块
  700. {
  701. user_datas[100] = ERY13; //Y13 有输出
  702. user_datas[101] = OUT_DIS;
  703. }
  704. else if(Y016) //勾针
  705. {
  706. user_datas[100] = ERY16; //Y016 有输出
  707. user_datas[101] = OUT_DIS;
  708. }
  709. else if(!X17) //送插稍退到位磁感
  710. {
  711. user_datas[100] = ERX17; //X17 输入不满足
  712. user_datas[101] = IN_EN;
  713. user_datas[75] = InPage;
  714. }
  715. else if(!X021) //送方块退到位磁感
  716. {
  717. user_datas[100] = ERX21; //X021 输入不满足
  718. user_datas[101] = IN_EN;
  719. user_datas[75] = InPage;
  720. }
  721. else //if(!X22带磁感) //压
  722. {
  723. user_datas[100] = ERX22; //X02 输入不满足
  724. user_datas[101] = IN_EN;
  725. user_datas[75] = InPage;
  726. }
  727. }
  728. }
  729. }
  730. if(Y06Flg != 0)
  731. {
  732. if(dwTickCount >= cDelayTime1)
  733. {
  734. CLRQ06; //下冲
  735. }
  736. }
  737. //下冲感应开关
  738. // if((M14))
  739. // {
  740. if(X13)
  741. {
  742. CLRQ06; //下冲
  743. M14= 0;//cMidleCoil[0] &= ~(1<<14); //下冲指示状态
  744. }
  745. else if((M14) && (dwTickCount >= cErrorTime)) //下冲故障警告
  746. {
  747. M14 = 0;M15 = 0;//cMidleCoil[0] &= ~((1<<14) | (1<<15)); //M14 M15
  748. //cMidleCoil[5] |= (1<<11); //下冲故障警告位
  749. user_datas[75] = ActionPage;
  750. user_datas[100] = 16; //显示下冲条件
  751. CLRQ06; //下冲
  752. }
  753. // }
  754. //手动勾针
  755. if((X03) || (M03))
  756. {
  757. if(dwTickCount >= cDelayTime7)
  758. {
  759. if(X03)
  760. cDelayTime7 = dwTickCount + (unsigned long)0;
  761. else
  762. cDelayTime7 = dwTickCount + (unsigned long)35;
  763. if(Y016 && !X03)
  764. CLRQ16; //勾针输出
  765. // 方块垫片 插稍垫片 下冲
  766. else if((!Y04Flg) && (!Y07Flg) && (!Y06Flg) &&
  767. // 送插稍 送方块 送插稍到位 送方块到位
  768. (!Y12) && (!Y13) && (!X16) && (!X20) && (X17) && (X021))
  769. {
  770. SETQ16;
  771. }
  772. else if((X03_UP) || (M03))// if(!X03)//勾针条件不满足警告
  773. {
  774. //cMidleCoil[5] |= (1<<12); //不用记录
  775. user_datas[75] = 6;
  776. M15 = 0;//cMidleCoil[0] &= ~((1<<15)); //M15
  777. user_datas[75] = OutPage;
  778. if(Y07Flg) //插稍埑片
  779. {
  780. user_datas[100] = ERY07; //Y07Flg 不能亮
  781. user_datas[101] = OUT_DIS;
  782. }
  783. else if(Y06Flg) //下冲
  784. {
  785. user_datas[100] = ERY06; //Y06Flg 不能亮
  786. user_datas[101] = OUT_DIS;
  787. }
  788. else if(Y04Flg) //方块埑片
  789. {
  790. user_datas[100] = ERY04; //Y04Flg 不能亮
  791. user_datas[101] = OUT_DIS;
  792. }
  793. else if(Y12) //送插稍
  794. {
  795. user_datas[100] = ERY12; //Y12 不能亮
  796. user_datas[101] = OUT_DIS;
  797. }
  798. else if(Y13) //送方块
  799. {
  800. user_datas[100] = ERY13; //Y13 不能亮
  801. user_datas[101] = OUT_DIS;
  802. }
  803. else if(X16) //送插稍到位
  804. {
  805. user_datas[100] = ERX16; //X16 不能亮
  806. user_datas[101] = IN_DIS;
  807. user_datas[75] = InPage;
  808. }
  809. else //(X20 != 0) //送方块到位
  810. {
  811. user_datas[100] = ERX20; //X020 不能亮
  812. user_datas[101] = IN_DIS;
  813. user_datas[75] = InPage;
  814. }
  815. }
  816. }
  817. M03 = 0;//cMidleCoil[0] &= ~(1<<3); //M3
  818. } //手动勾针关
  819. //手动勾针完成
  820. //手动压带
  821. if((M04))
  822. {
  823. if(dwTickCount >= cDelayTime7)
  824. {
  825. cDelayTime7 = dwTickCount + (unsigned long)35;
  826. if(Y005)
  827. CLRQ05; //压带关
  828. else
  829. {
  830. SETQ05; //压带开
  831. FKCX_cErrorTime1 = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  832. YaDaiError = 1;
  833. }
  834. }
  835. M04 = 0;//cMidleCoil[0] &= ~(1<<4); //M4
  836. if(Y005) //压带
  837. cYaDai = 1;
  838. else
  839. cYaDai = 0;
  840. M04 = 0;
  841. }
  842. if(X022) //压带到位
  843. {
  844. YaDaiError = 0;
  845. }// 压带 压带到位
  846. if(YaDaiError && Y005 && (!X022) && (dwTickCount >= FKCX_cErrorTime1))
  847. {
  848. //cMidleCoil[5] |= (1<<12); //不记录
  849. user_datas[75] = ActionPage;
  850. user_datas[100] = 2; //压带出错,没法压到位
  851. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  852. user_datas[101] = 0;
  853. YaDaiError = 0;
  854. }
  855. //手动压带完成
  856. //手动定位
  857. if(X025 || M22 || M23)
  858. {
  859. if(Y007 && M22 && !X025) // 插销埑片
  860. {
  861. CLRQ07;
  862. }
  863. else if(M23 && Y004 && !X025)
  864. {
  865. CLRQ04;
  866. }// 送稍到位 送方块到位 送稍,方块退到位 勾针
  867. else if((!X16) && (!X20) && (X17) && (X021) && (!Y016))
  868. {
  869. if(M22 && !Y004) //插销一边
  870. {
  871. SETQ07;
  872. }
  873. else if(!Y007)
  874. {
  875. SETQ04;
  876. }
  877. M22 = 0;
  878. M23 = 0;
  879. }
  880. else if(X25_UP ||M22 || M23)//定位条件不满足警告 || M
  881. {
  882. //cMidleCoil[5] |= (1<<12); //不用记录
  883. user_datas[75] = 6;
  884. M15 = 0;//cMidleCoil[0] &= ~((1<<15)); //M15
  885. user_datas[75] = InPage;
  886. if(Y016) //勾针
  887. {
  888. user_datas[100] = ERY16; //Y016 不能亮
  889. user_datas[101] = OUT_DIS;
  890. user_datas[75] = OutPage;
  891. }
  892. else if(X16) //送稍到位
  893. {
  894. user_datas[100] = ERX16; //X16 不能亮
  895. user_datas[101] = IN_DIS;
  896. }
  897. else if(X20) //方块到位
  898. {
  899. user_datas[100] = ERX20; //X20 不能亮
  900. user_datas[101] = IN_DIS;
  901. }
  902. else if(!X17) //送稍退到位
  903. {
  904. user_datas[100] = ERX17; //X17 要亮
  905. user_datas[101] = IN_EN;
  906. }
  907. else //(!X021) //方块退到位
  908. {
  909. user_datas[100] = ERX21; //X021 要亮
  910. user_datas[101] = IN_EN;
  911. }
  912. }
  913. M22 = 0;M23 = 0;//cMidleCoil[1] &= ~((1<<6) | (1<<7)); //M22,M23
  914. }
  915. else if(X25_DW && (!X27))
  916. {
  917. CLRQ04;
  918. CLRQ07;
  919. }
  920. //手动定位完成
  921. //手动送料
  922. // 手动送料
  923. if((X010) || M20 || M21)
  924. {
  925. FKCX_SETDR();
  926. if(dwTickCount >= cDelayTime7)
  927. {
  928. if(X010)
  929. cDelayTime7 = dwTickCount + (unsigned long)0;
  930. else
  931. cDelayTime7 = dwTickCount + (unsigned long)35;
  932. if((M20)) //手动送插销
  933. {
  934. CLRQ13; //送方块
  935. if(Y12 && !X010)
  936. CLRQ12;
  937. // 方块有料!X15 勾针阀 插销垫片 方块垫片 下冲阀 给料电磁阀 给料前点
  938. else if((!bGeiFang) && (!Y016) && (!Y07Flg) && (!Y04Flg) && (!Y06Flg) && (!Y10) && (!X023))
  939. SETQ12;
  940. else if((X10_UP) || M20)//送料不满足条件
  941. {
  942. //cMidleCoil[5] |= (1<<12); //不用记录
  943. user_datas[75] = OutPage;
  944. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M13,M15
  945. if(Y016) //勾针阀
  946. {
  947. user_datas[100] = ERY16; //
  948. user_datas[101] = OUT_DIS;
  949. }
  950. else if(Y07Flg) //插销垫片
  951. {
  952. user_datas[100] = ERY07; //
  953. user_datas[101] = OUT_DIS;
  954. }
  955. else if(Y06Flg) //下冲阀
  956. {
  957. user_datas[100] = ERY06; //
  958. user_datas[101] = OUT_DIS;
  959. }
  960. else if(Y04Flg) //方块垫片
  961. {
  962. user_datas[100] = ERY04; //
  963. user_datas[101] = OUT_DIS;
  964. }
  965. else if(Y10) //给料电磁阀
  966. {
  967. user_datas[100] = ERY10; //
  968. user_datas[101] = OUT_DIS;
  969. }
  970. else if(bGeiFang)
  971. {
  972. user_datas[100] = ERX15; //
  973. if(X15)
  974. user_datas[101] = IN_DIS;
  975. else
  976. user_datas[101] = IN_EN;
  977. user_datas[75] = InPage;
  978. }
  979. else //(X023)
  980. {
  981. user_datas[100] = ERX23;
  982. user_datas[101] = IN_DIS;
  983. user_datas[75] = InPage;
  984. }
  985. }
  986. }
  987. else //手动送方块
  988. {
  989. CLRQ12;
  990. if(Y13 && !X010)
  991. CLRQ13;
  992. // 勾针阀 插销垫片 方块垫片 下冲阀 给料电磁阀 给料前点
  993. else if((!Y016) && (!Y07Flg) && (!Y04Flg) && (!Y06Flg) && (!Y017) && (!X024))
  994. SETQ13;
  995. else if((X10_UP) || M21)//送料不满足条件
  996. {
  997. //cMidleCoil[5] |= (1<<12); //不用记录
  998. user_datas[75] = OutPage;
  999. M15 = 0;//cMidleCoil[0] &= ~((1<<15)); //M15
  1000. if(Y016) //勾针阀
  1001. {
  1002. user_datas[100] = ERY16;
  1003. user_datas[101] = OUT_DIS;
  1004. }
  1005. else if(Y07Flg) //插销垫片
  1006. {
  1007. user_datas[100] = ERY07;
  1008. user_datas[101] = OUT_DIS;
  1009. }
  1010. else if(Y06Flg) //下冲阀
  1011. {
  1012. user_datas[100] = ERY07;
  1013. user_datas[101] = OUT_DIS;
  1014. }
  1015. else if(Y04Flg) //方块垫片
  1016. {
  1017. user_datas[100] = ERY04;
  1018. user_datas[101] = OUT_DIS;
  1019. }
  1020. else if(Y017) //给料电磁阀
  1021. {
  1022. user_datas[100] = ERY15;
  1023. user_datas[101] = OUT_DIS;
  1024. }
  1025. else //(X024) //给料前点
  1026. {
  1027. user_datas[100] = ERX24;
  1028. user_datas[101] = IN_DIS;
  1029. user_datas[75] = InPage;
  1030. }
  1031. }
  1032. }
  1033. }
  1034. M20 = 0;M21 = 0;//cMidleCoil[1] &= ~((1<<4) | (1<<5)); //M20,M21
  1035. }
  1036. if(X06_UP || M18 || M19)
  1037. {
  1038. if(dwTickCount >= cDelayTime7)
  1039. {
  1040. if(X006)
  1041. cDelayTime7 = dwTickCount + (unsigned long)0;
  1042. else
  1043. cDelayTime7 = dwTickCount + (unsigned long)35;
  1044. if((M18)) //给插销
  1045. {
  1046. CLRQ14;
  1047. CLRQ17; //夹方块关
  1048. if((Y10) && !X006)
  1049. {
  1050. CLRQ10; //给方块关
  1051. CLRQ11; //夹插稍关
  1052. }
  1053. //送料在原点 在夹紧情况下无料 或夹张开 送料 !X15
  1054. else if((X17) && ((!Y11 && !bGeiXiao) || Y11) && (!Y12) && !bGeiFang)
  1055. { // !X14
  1056. SETQ10;
  1057. SETQ11;
  1058. }
  1059. else if(X06_UP || M18)//不满足给料
  1060. {
  1061. CLRQ10;
  1062. //cMidleCoil[5] |= (1<<12); //不用记录
  1063. user_datas[75] = OutPage;
  1064. M15 = 0;//cMidleCoil[0] &= ~((1<<15)); //M15稍条件不满足条件
  1065. if(((!Y11) && (bGeiXiao))) //已经有料不能再送
  1066. { //X14
  1067. user_datas[100] = ERX14; //
  1068. if(X14)
  1069. user_datas[101] = IN_DIS;
  1070. else
  1071. user_datas[101] = IN_EN;
  1072. user_datas[75] = InPage;
  1073. }
  1074. else if(Y12) //送料电磁阀
  1075. {
  1076. user_datas[100] = ERY12;
  1077. user_datas[101] = OUT_DIS;
  1078. }
  1079. else if(!X17) //送料原点
  1080. {
  1081. user_datas[100] = ERX17;
  1082. user_datas[101] = IN_EN;
  1083. user_datas[75] = InPage;
  1084. }
  1085. }
  1086. }
  1087. else //给方块
  1088. {
  1089. CLRQ10; //给插稍关
  1090. CLRQ11; //夹插稍关
  1091. if((Y017) && !X006)
  1092. {
  1093. CLRQ17; //给方块关
  1094. CLRQ14; //夹方块关
  1095. }
  1096. //送料在原点 在夹紧情况下无料 或夹张开 送料 没稍(X14)
  1097. else if((X021) && (((!Y14) && (!bGeiFang)) || Y14) && (!Y13) && !bGeiXiao)
  1098. { //!X15
  1099. SETQ14; //夹方块开
  1100. SETQ17; //给方块开
  1101. }
  1102. else if(X06_UP || M19) //不满足给料
  1103. {
  1104. CLRQ17;
  1105. //cMidleCoil[5] |= (1<<12); //不用记录
  1106. user_datas[75] = OutPage;
  1107. M15 = 0;//cMidleCoil[0] &= ~((1<<15));
  1108. if(((!Y14) && (bGeiFang))) //已经有料不能再送
  1109. {
  1110. user_datas[100] = ERX15; //
  1111. if(X15)
  1112. user_datas[101] = IN_DIS;
  1113. else
  1114. user_datas[101] = IN_EN;
  1115. user_datas[75] = InPage;
  1116. }
  1117. else if(Y13) //送方块电磁阀
  1118. {
  1119. user_datas[100] = ERY13;
  1120. user_datas[101] = OUT_DIS;
  1121. }
  1122. else if(!X021) //送料原点
  1123. {
  1124. user_datas[100] = ERX11;
  1125. user_datas[101] = IN_EN;
  1126. user_datas[75] = InPage;
  1127. }
  1128. else //插稍这边有料
  1129. {
  1130. user_datas[100] = ERX14;
  1131. user_datas[101] = IN_EN;
  1132. user_datas[75] = InPage;
  1133. }
  1134. }
  1135. }
  1136. }
  1137. M18 = 0;M19 = 0;//cMidleCoil[1] &= ~((1<<2) | (1<<3)); //M18,M19
  1138. }
  1139. //手动送料完成
  1140. //手动给料
  1141. if(Y10 && Y11 && X23_UP) //插到位后自动夹料
  1142. {
  1143. in_delay = dwTickCount + (unsigned long)50;
  1144. }
  1145. else if(X023 && Y11 && !X007 && (dwTickCount >= in_delay))
  1146. {
  1147. CLRQ11;
  1148. }
  1149. if(Y14 && Y017 && X24_UP) //插到位后自动夹料
  1150. {
  1151. in_delay = dwTickCount + (unsigned long)50;
  1152. }
  1153. else if(Y14 && X024 && !X007 && (dwTickCount >= in_delay))
  1154. {
  1155. CLRQ14;
  1156. }
  1157. //手动给料完成
  1158. //手动夹料
  1159. if(X007 || M16 || M17)
  1160. {
  1161. if(dwTickCount >= cDelayTime7)
  1162. {
  1163. if(X007)
  1164. cDelayTime7 = dwTickCount + (unsigned long)0;
  1165. else
  1166. cDelayTime7 = dwTickCount + (unsigned long)35;
  1167. if((M16)) //给插销
  1168. {
  1169. if(Y11 && !X007)
  1170. CLRQ11; //夹插稍关
  1171. else
  1172. SETQ11; //夹插稍开
  1173. }
  1174. else// if(M17 || (cHMI_Test == 0)) //给方块
  1175. {
  1176. if(Y14 && !X007)
  1177. CLRQ14; //夹方块关
  1178. else
  1179. SETQ14; //夹方块开
  1180. }
  1181. }
  1182. M16 = 0;M17 = 0;//cMidleCoil[1] &= ~((1<<0) | (1<<1)); //M16,M17
  1183. }
  1184. }
  1185. void FKCX_AutoStep(void)
  1186. {
  1187. unsigned long ch;
  1188. switch(cStepMByte)
  1189. {
  1190. case 1: //从插销步开始工作
  1191. //电机开始 压带到位 或半循环
  1192. if((Y005 && X022) || (cHalfRun == 1)) //先压带
  1193. {
  1194. cStepMByte2 = 0;
  1195. }
  1196. else
  1197. {
  1198. cStepMByte2 = 1; //拖带起动
  1199. cStopOver = 0;
  1200. }
  1201. //给销开始
  1202. cStepMByte3 = 1;
  1203. cGeiLiaoNum = 0;
  1204. //转下一步
  1205. cStepMByte = 2;
  1206. bStopXiaCong = 0;
  1207. if(bGeiXiao) //X14
  1208. cStepMByte3 = 0;
  1209. break;
  1210. //等待给料,电机拖带
  1211. case 2:
  1212. FK_Auto_Con_XY();
  1213. bStopXiao = 1;
  1214. //没料
  1215. JiaXiao_XY();
  1216. //拖带和给料已完成
  1217. if((cStepMByte2 == 0) && (cStepMByte3 == 0))
  1218. {
  1219. cStepMByte = 3;
  1220. cStepMByte3 = 1; //送梢启动
  1221. }
  1222. break;
  1223. //送插销
  1224. case 3:
  1225. SongXiao_XY();
  1226. //送料完毕(销)
  1227. if(cStepMByte3 == 0)
  1228. {
  1229. cStepMByte = 4;
  1230. //半循环 单边
  1231. if((cHalfRun != 1) && (user_datas[8] != 56)) //半
  1232. {
  1233. if((!bGeiFang)) //!X15
  1234. cStepMByte4 = 1;
  1235. else
  1236. cStepMByte4 = 0; //已经有料
  1237. cGeiLiaoNum = 0;
  1238. }
  1239. cErrorTime = dwTickCount + (unsigned long)3 * FKCX_ERRORTIME;
  1240. if(user_datas[8] != 55)
  1241. {
  1242. SETQ06; //下冲
  1243. SETQ07; //插稍垫片
  1244. cDelayTime1= dwTickCount + (unsigned long)user_datas[2]*10;
  1245. M14 = 1;//cMidleCoil[0] |= (1<<14); //M14
  1246. }
  1247. }
  1248. break;
  1249. //下冲动作
  1250. case 4:
  1251. if(Y06Flg)
  1252. {
  1253. if(dwTickCount >= cDelayTime1)
  1254. {
  1255. CLRQ06; //下冲
  1256. bStopFang = 1;
  1257. bStopXiao = 0;
  1258. bStopXiaCong = 0;
  1259. }
  1260. }
  1261. //下冲感应开关
  1262. if(X13 || (user_datas[8] == 55)) //双开方式
  1263. {
  1264. bStopXiao = 0;
  1265. bStopXiaCong = 0;
  1266. bStopFang = 1;
  1267. CLRQ06; //下冲
  1268. }
  1269. if(X13_DW || (user_datas[8] == 55))
  1270. {
  1271. M14 = 0;//cMidleCoil[0] &= ~(1<<14); //M14
  1272. CLRQ07; //插销垫片
  1273. if(cHalfRun == 1) //半循环
  1274. {
  1275. cStepMByte = 0;
  1276. FKCX_bRunning = 0;
  1277. cHalfRun = 0;
  1278. CLRQ02; //运行指示
  1279. }
  1280. else if(user_datas[8] == 56)
  1281. {
  1282. cStepMByte = 8; //直接跳到结束
  1283. }else
  1284. cStepMByte = 5;
  1285. }
  1286. if(dwTickCount >= cErrorTime)
  1287. {
  1288. //cMidleCoil[5] |= (1<<11); //记录
  1289. user_datas[75] = ActionPage;
  1290. user_datas[100] = 16; //不冲检测不到复位感应
  1291. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  1292. user_datas[101] = 0;
  1293. // bStop = 1;
  1294. CLRQ07; //插销垫片
  1295. }
  1296. //给方块开始
  1297. JiaFang_XY();
  1298. break;
  1299. case 5:
  1300. JiaFang_XY();
  1301. if(cStepMByte4 == 0) //给方块已经完成
  1302. {
  1303. cStepMByte = 6;
  1304. cStepMByte4 = 1; //送方块开始
  1305. }
  1306. break;
  1307. case 6:
  1308. SongFang_XY();
  1309. //送料完毕(销)
  1310. if(cStepMByte4 == 0)
  1311. {
  1312. cStepMByte = 7;
  1313. SETQ06; //下冲
  1314. SETQ04; //方块垫片
  1315. cDelayTime1 = dwTickCount + (unsigned long)user_datas[2]*10;
  1316. cErrorTime = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  1317. M14 = 1;//cMidleCoil[0] |= (1<<14); //M14
  1318. }
  1319. break;
  1320. //下冲动作
  1321. case 7:
  1322. if(Y06Flg)
  1323. {
  1324. if(dwTickCount >= cDelayTime1)
  1325. {
  1326. CLRQ06; //下冲
  1327. }
  1328. }
  1329. //下冲感应开关
  1330. if(X13)
  1331. {
  1332. CLRQ06; //下冲
  1333. bStopFang = 0;
  1334. bStopXiaCong = 0;
  1335. bStopFang = 0;
  1336. M14 = 0;//cMidleCoil[0] &= ~(1<<14); //M14
  1337. FKCX_CLRDR();
  1338. }
  1339. if(X13_DW)
  1340. {
  1341. CLRQ04; //方块垫片
  1342. cStepMByte = 8;
  1343. FKCX_CLRDR();
  1344. cDelayTime1 = dwTickCount + (unsigned long)user_datas[13]*10 + 40;
  1345. //计数器
  1346. if(cHalfRun != 1) //半循环不用计数
  1347. {
  1348. FKCX_cCountTime = 6;
  1349. AddToTal(76);//存生产总量
  1350. SETQ01;
  1351. }
  1352. }
  1353. if(dwTickCount >= cErrorTime)
  1354. {
  1355. //cMidleCoil[5] |= (1<<11); //记录
  1356. user_datas[75] = ActionPage;
  1357. user_datas[100] = 16; //不冲检测不到复位感应
  1358. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  1359. user_datas[101] = 0;
  1360. // bStop = 1;
  1361. CLRQ04; //方块垫片
  1362. }
  1363. break;
  1364. //一个周期完成 方块没插在拉链上带出来
  1365. case 8:
  1366. ch = (((unsigned long)user_datas[85])<< 16 ) + user_datas[84];
  1367. //在先手动压带情况下
  1368. if((cYaDai && (cHalfRun == 0))|| (cHalfRun == 1) || (cHalfRun == 2)|| ((FKCX_cTotal >= ch) && ch))
  1369. {
  1370. // SETQ05;
  1371. CLRQ02; //运行指示灯
  1372. cYaDai = 0;
  1373. FKCX_bRunning = 0;
  1374. cHalfRun = 0;
  1375. cStepMByte = 0;
  1376. }
  1377. //在其它启动情况下,启动下一周期
  1378. else if(dwTickCount >= cDelayTime1)
  1379. {
  1380. cHalfRun = 0;
  1381. // SETQ02; //运行指示灯
  1382. CLRQ05; //松压带
  1383. cStepMByte = 9;
  1384. }
  1385. cYaDai = 0;
  1386. break;
  1387. case 9:
  1388. if(!X022) //松带离开
  1389. {
  1390. CalProSP(78); //计算生产速度
  1391. cStepMByte = 1; //开始
  1392. }
  1393. break;
  1394. }
  1395. }
  1396. void FKCX_AutoAction(void)
  1397. {
  1398. static unsigned long c10msDelay = 0;
  1399. user_datas[121] = cStepMByte;
  1400. user_datas[122] = cStepMByte1;
  1401. user_datas[123] = cStepMByte2;
  1402. user_datas[124] = cStepMByte3;
  1403. user_datas[125] = cStepMByte4;
  1404. user_datas[126] = cHalfRun;
  1405. user_datas[127] = FKCX_bRunning;
  1406. // user_datas[128] = cReady;
  1407. if(dwTickCount >= c10msDelay)
  1408. {
  1409. c10msDelay = dwTickCount+10;
  1410. if(FKCX_cCountTime > 0)
  1411. {
  1412. FKCX_cCountTime--;
  1413. if(FKCX_cCountTime == 0)
  1414. CLRQ01; //计数器
  1415. }
  1416. }
  1417. bGeiXiao = X14; //插稍光电
  1418. bGeiFang = X15; //方块光电
  1419. if(M15) //M15 故障确定
  1420. {
  1421. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M13,M15
  1422. user_datas[100] = 0;
  1423. user_datas[75] = 0;
  1424. cDelayTime7 = dwTickCount + (unsigned long)1010;
  1425. }
  1426. if(M09) //清产量
  1427. {
  1428. if(dwTickCount >= cDelayTime8)
  1429. {
  1430. M09 = 0;//cMidleCoil[0] &= ~(1<<9);
  1431. ClrcToTal(76);
  1432. }
  1433. }
  1434. else
  1435. {
  1436. cDelayTime8 = dwTickCount + (unsigned long)120*10;
  1437. }
  1438. //下冲到位信号时关垫片
  1439. if(X13_DW)
  1440. {
  1441. M16 = 0;//cMidleCoil[1] &= ~(1<<0); //M16
  1442. }
  1443. //手动模式
  1444. if(FKCX_bRunning == 0)
  1445. {
  1446. //手条件 停止(常闭) 左右垫片
  1447. if(((!Y02)) && (!X01 || Y04Flg || Y07Flg))
  1448. {
  1449. //手动钩针 钩针输出 手动下冲 下冲输出
  1450. if( (!X03) && (!Y016) && (!X011) && (!Y06Flg) &&
  1451. //手动给料 插稍给料 方块给料 手动夹料
  1452. (!X006) && (!Y10) && (!Y017) && (!X007) &&
  1453. //插稍夹料 方块夹料 手动送料 插稍送料 块送料
  1454. (!Y11) && (!Y14) && (!X010) && (!Y12) && (!Y13) &&
  1455. //方块选择 插稍送料原点 方块送料原点
  1456. /*((X20) || (cHMI_Test != 0)) && */(X17) && (X021))
  1457. {
  1458. cReady = 1;
  1459. }
  1460. else
  1461. cReady = 0;
  1462. FKCX_ManualAciton();
  1463. }
  1464. }
  1465. else if(!X01) //停止开关
  1466. {
  1467. M00 = 0;M01 = 0;//cMidleCoil[0] &= ~((1<<0) | (1<<1)); //M0 = 0,M1 = 0;
  1468. M24 = 0;M25 = 0;//cMidleCoil[1] &= ~((1<<8) | (1<<9)); //M24 = 0,M25 = 0;
  1469. FKCX_AutoStep();
  1470. }
  1471. //送料和埑块(定位)互锁保护
  1472. if((Y04Flg) || (Y07Flg)) //埑块输出
  1473. {
  1474. CLRQ12;
  1475. CLRQ13;
  1476. }
  1477. if((Y12) || (Y13)) //送料输出
  1478. {
  1479. CLRQ04;
  1480. CLRQ07;
  1481. }
  1482. //3540 2550
  1483. //手动下冲完成
  1484. //自动
  1485. //
  1486. //停止 故障停机 按停止键
  1487. if((FKCX_bStop) || M02 || ((X01_UP)) || X04)
  1488. {
  1489. cHalfRun = 0;
  1490. FKCX_bRunning = 0;
  1491. AxisEgmStop(X_AXIS);
  1492. if(!Y05Flg)FKCX_SETDR(); //电机放松
  1493. if(X04)
  1494. {
  1495. user_datas[75] = 6;
  1496. user_datas[100] = 4+48; //给料出错显示
  1497. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  1498. user_datas[101] = 2;
  1499. }
  1500. if((X01 || M02)) //停止按下
  1501. {
  1502. M16 = 0;M17 = 0;M18 = 0;M19 = 0;M20 = 0;M21 = 0;M22 = 0;
  1503. M23 = 0;M24 = 0;M25 = 0;M26 = 0;M27 = 0;M28 = 0;M29 = 0;
  1504. M30 = 0;M31 = 0;////cMidleCoil[1] = 0;
  1505. if(!X04)
  1506. {
  1507. user_datas[100] = 0;
  1508. user_datas[101] = 0;
  1509. user_datas[75] = 0;
  1510. }
  1511. }
  1512. cStopOver++;
  1513. // cStopOver = 0;
  1514. M02 = 0;//cMidleCoil[0] &= ~(1<<2);
  1515. // 压带到位  完全停止 手动压带
  1516. if((!X022) || ((cStopOver > 2) && (X01_UP)))
  1517. {
  1518. Y000 = 0;
  1519. Y001 = 0;
  1520. Y002 = 0;
  1521. Y003 = 0;
  1522. Y004 = 0;
  1523. Y005 = 0;
  1524. Y006 = 0;
  1525. Y007 = 0;
  1526. Y010 = 0;
  1527. Y011 = 0;
  1528. Y012 = 0;
  1529. Y013 = 0;
  1530. Y014 = 0;
  1531. Y016 = 0;
  1532. Y017 = 0;
  1533. if(cStopOver == 0)
  1534. cStepMByte = 25;
  1535. else if(!X022)
  1536. cStepMByte = 26;
  1537. else
  1538. cStepMByte = 27;
  1539. cStepMByte1 = 0;
  1540. cStepMByte2 = 0;
  1541. cStepMByte3 = 0;
  1542. cStepMByte4 = 0;
  1543. cStopOver = 3;
  1544. bStopXiao = 0;
  1545. bStopFang = 0;
  1546. bStopXiaCong = 0;
  1547. }
  1548. else //故障停止
  1549. {
  1550. // if(FKCX_bStop)
  1551. // {
  1552. // cStopOver = 0;
  1553. // }
  1554. if((FKCX_bStop == 0) || ((cStopOver == 2) && X01_UP))
  1555. cYaDai = 0;
  1556. Y000 = 0;
  1557. Y001 = 0;
  1558. Y002 = 0;
  1559. Y003 = 0;
  1560. Y004 = 0;
  1561. Y006 = 0;
  1562. Y007 = 0;
  1563. Y010 = 0;
  1564. Y011 = 0;
  1565. Y012 = 0;
  1566. Y013 = 0;
  1567. Y014 = 0;
  1568. Y016 = 0;
  1569. Y017 = 0;
  1570. cStepMByte = 98;
  1571. cStepMByte1 = 0;
  1572. cStepMByte2 = 0;
  1573. cStepMByte3 = 0;
  1574. cStepMByte4 = 0;
  1575. }
  1576. FKCX_bStop = 0;
  1577. }
  1578. }
  1579. void FKCX_Action(void)
  1580. {
  1581. FKCX_AutoAction();
  1582. if(Y05Flg)Y05 = 1;
  1583. else Y05 = 0;
  1584. if(Y04Flg)Y04 = 1;
  1585. else Y04 = 0;
  1586. if(Y07Flg)Y07 = 1;
  1587. else Y07 = 0;
  1588. if(Y06Flg)Y06 = 1;
  1589. else Y06 = 0;
  1590. }
  1591. void FK_Auto_Con_XY()
  1592. {
  1593. switch(cStepMByte2)
  1594. {
  1595. case 0:
  1596. CLRQ00;
  1597. AxisEgmStop(X_AXIS);
  1598. break;
  1599. case 1: //离合器起动
  1600. cStepMByte2 = 2;
  1601. SETQ00; //离合器输出
  1602. //if(user_datas[90] == 55)
  1603. // cDelayTime3 = dwTickCount + (unsigned long)600;
  1604. //步进启动
  1605. FKCX_CLRDR();
  1606. if(!X_DRV)MoveAction_Const_AccDec(X_AXIS,MXC_DIR_P,user_datas[11],user_datas[10],user_datas[9],5);
  1607. cErrorTime = dwTickCount + (unsigned long)100 * user_datas[14];
  1608. break;
  1609. case 2: //过链接近下降沿
  1610. if((X12_DW) || ((user_datas[90] == 55) && (dwTickCount >= cDelayTime3)))
  1611. {
  1612. cStepMByte2 = 3;
  1613. cDelayTime3 = dwTickCount + (unsigned long)3;
  1614. cErrorTime = dwTickCount + (unsigned long)FKCX_ERRORTIME * 2;
  1615. cDelayTime4 = dwTickCount + (unsigned long)user_datas[7]; // 延时上勾针
  1616. AxisChangeSpeed(X_AXIS,user_datas[12]);
  1617. }
  1618. else if((dwTickCount >= cErrorTime) && user_datas[14]) //拖带警告
  1619. {
  1620. //cMidleCoil[5] |= (1<<0); //记录
  1621. user_datas[75] = ActionPage;
  1622. user_datas[100] = 1; //检查过链接近开关或没有拉链
  1623. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  1624. user_datas[101] = 0;
  1625. bStop = 1;
  1626. }
  1627. break;
  1628. case 3:
  1629. //过链接近上升沿 //拖带到
  1630. if(((X12_UP) || (user_datas[90] == 55)) && (dwTickCount >= cDelayTime3))
  1631. {
  1632. AxisChangeSpeed(X_AXIS,user_datas[12]);
  1633. cStepMByte2 = 4;
  1634. cDelayTime3 = dwTickCount + (unsigned long)user_datas[6];
  1635. }
  1636. else if(dwTickCount >= cErrorTime) //拖带警告
  1637. {
  1638. //cMidleCoil[5] |= (1<<0); //记录
  1639. user_datas[75] = ActionPage;
  1640. user_datas[100] = 1; //检查过链接近开关或没有拉链
  1641. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  1642. user_datas[101] = 0;
  1643. bStop = 1;
  1644. }
  1645. //要加延时上勾针
  1646. if(dwTickCount >= cDelayTime4)
  1647. SETQ16; //上勾针
  1648. break;
  1649. case 4:
  1650. //要加延时上勾针
  1651. if(dwTickCount >= cDelayTime4)
  1652. SETQ16; //上勾针
  1653. if((dwTickCount >= cDelayTime3) || X026) //到位或延时停时间到
  1654. {
  1655. cStepMByte2 = 5;
  1656. CLRQ00; //离合停
  1657. SETQ05; //压带
  1658. cErrorTime = dwTickCount + (unsigned long)FKCX_ERRORTIME;
  1659. AxisEgmStop(X_AXIS); //步进电机停
  1660. }
  1661. break;
  1662. case 5: //压带到
  1663. if(X022 != 0)
  1664. {
  1665. cStepMByte2 = 6; //拖带完成
  1666. cDelayTime3 = dwTickCount + (unsigned long)55;
  1667. }
  1668. else if(dwTickCount >= cErrorTime) //压带警告
  1669. {
  1670. //cMidleCoil[5] |= (1<<1); //记录
  1671. user_datas[75] = ActionPage;
  1672. user_datas[100] = 2; //压带出错,没法压到位
  1673. M15 = 0;//cMidleCoil[0] &= ~(1<<15); //M15
  1674. user_datas[101] = 0;
  1675. bStop = 1;
  1676. }
  1677. break;
  1678. case 6:
  1679. if(dwTickCount >= cDelayTime3)
  1680. {
  1681. CLRQ16; //下勾针
  1682. cStepMByte2 = 0; //拖带完成
  1683. // FKCX_SETDR(); //步进电机松
  1684. }
  1685. break;
  1686. }
  1687. }
  1688. #endif