• «
  • 1
  • 2
  • 3
  • »
  • Pages: 1/3     Go
nos001
级别: 探索解密
精华主题: 0
发帖数量: 54 个
工控威望: 110 点
下载积分: 814 分
在线时间: 42(小时)
注册时间: 2018-03-31
最后登录: 2022-10-06
查看nos001的 主题 / 回贴
楼主  发表于: 2019-06-27 16:21
图片:
找不到st编程的教程,硬是自己摸索,一点一点抠出来的。
后来发现iQ-R 结构化文本(ST)编程指南就是教程,关于语法、其他手册上找不到的较难理解的结构变量都有示例。
完全st编程的中断写法好几天无从着手,把FXCPU结构化顺序指令篇看了一遍又一遍,才摸索出来,具体见工程附件。
工程是未完成的不完整工程,只是希望自己认为较难理解手册没提及的st编程方法对需要的同志有所帮助。

另外吐槽一下st编辑器,变量不能在程序里定义,只能在标签窗口定义,结构体成员引用不能单独设置字体颜色,这些都影响阅读。
总之,gx works2 的st编辑器比较简陋,但可阅读性已经比梯形图好多了。

复制代码
  1. (*****************************************************************************************************
  2. * 程序“恒定扫描”设置
  3. * M8039 = TRUE, 则程序为恒定周期扫描
  4. * D8039 = 扫描周期, 单位为ms,最小恒定扫描周期为1ms
  5. *****************************************************************************************************)
  6. M8039 := TRUE;
  7. IF M8039 THEN
  8.     D8039 := 5;
  9. END_IF;
  10. (*****************************************************************************************************
  11. * 初始化
  12. *****************************************************************************************************)
  13. EI ( TRUE );        (* 允许中断 *)
  14. IF M8002 THEN
  15.     
  16.     FOR j := 0 TO 30 BY 1 DO        
  17.         Tcnt[j] := -1;        
  18.     END_FOR;
  19.     RST( TRUE, HmiKey_ManualOP );
  20.     RST( TRUE, bMode_Manual );
  21.     RST( TRUE, HmiKey_AutoPack );
  22.     RST( TRUE, bMode_Auto );
  23.     DownFill_FB_Call( );
  24.     VerticalSeal_FB_Call( );          
  25.     BagFold_FB_Call( );
  26.     
  27. END_IF;
  28. (* 每包包装时间所需计数值 = 60000ms / 10ms / 预置包装速度,每分钟为60000ms,定时器为10ms *)
  29. TVal_Packing :=  6000 / Param_PresetSpeed;
  30. (*****************************************************************************************************
  31. * 清零
  32. *****************************************************************************************************)
  33. IF( HmiKey_BagCnt_CLR ) THEN
  34.     MakeBagCnt := 0;
  35. END_IF;
  36. IF( HmiKey_PackingCnt_CLR ) THEN
  37.     PackingCnt := 0;
  38. END_IF;    
  39. (*****************************************************************************************************
  40. * 警报发生
  41. * 报警锁,任何一种警报发生,自动包装都将停止运行
  42. ****************************************************************************************************)
  43. IF( bAlarm_Lock_AutoPack = TRUE ) THEN
  44.     
  45.     ZRST( TRUE, Y001, Y007 );
  46.     ZRST( TRUE, Y010, Y017 );
  47.     ZRST( TRUE, Y020, Y027 );    
  48.             
  49.     FOR j := 0 TO 30 BY 1  DO        
  50.         Tcnt[j] := -1;        
  51.     END_FOR;    
  52.     
  53. END_IF;
  54. (*****************************************************************************************************
  55. * HMI按钮开关
  56. *****************************************************************************************************)
  57. Key_Hmi_FB_Call();
  58. (*****************************************************************************************************
  59. * 包装流程
  60. *
  61. *****************************************************************************************************)
  62. IF( bMode_Auto ) AND ( bAlarm_Lock_AutoPack = FALSE ) AND ( HmiKey_FillPack[1]  OR  HmiKey_EmptyBagTest[1]  OR  HmiKey_FillBagOne[1] ) THEN
  63.     
  64.     IF( HmiKey_FillPack[1]  ) THEN
  65.         DownFill_FB_Call( hmi_key := KeyDownID,  pT_DownFillDly := Tcnt[ ID_DOWN_FILL_DLY ],   iX := iX_DownFill ); (* 下料 *)
  66.     END_IF;
  67.         
  68.     IF( HmiKey_EmptyBagTest[1]  OR  HmiKey_FillBagOne[1] ) THEN
  69.         
  70.         IF( PackingFlow = 0 ) THEN  
  71.                       
  72.             SET( TRUE, bEnd_DownFill );
  73.             PackingFlow := FLOW_PULL_FILM;
  74.                         
  75.         END_IF;
  76.         
  77.     END_IF;
  78.     VerticalSeal_FB_Call( bEnable := bServo_End );    (* 纵封 *)        
  79.     
  80.     BagFold_FB_Call( bEnable:= bServo_End );          (* 折角 *)
  81.     
  82.     ServoControl_FB_Call( pServoEnd := bServo_End  ); (* 伺服拉膜;指针参数,指向全局变量 *)
  83.     
  84.     (* 真空箱闭合 *)
  85.     IF( bServo_End = TRUE ) THEN
  86.         
  87.         IF( Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] = -1 ) THEN    
  88.             Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] := Param_VcmBoxCloseDly ;    
  89.         END_IF;
  90.         
  91.         IF( Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] = 0 )  AND ( bAlarm_GlassDoor = FALSE ) THEN
  92.             
  93.             Tcnt[ ID_VACUUM_BOX_CLOSE_DLY ] := -255;
  94.             Tcnt[ ID_BAG_CUT_DLY ] := Param_CutDly;
  95.             SET( TRUE, Y_VacuumBox_Y3 );            
  96.             
  97.         END_IF;      
  98.           
  99.     END_IF;
  100.     (* 剪切包装膜 *)
  101.     IF( Y_VacuumBox_Y3 ) THEN
  102.         
  103.         IF( Tcnt[ ID_BAG_CUT_DLY ]  = 0 ) AND ( bAlarm_GlassDoor = FALSE ) THEN
  104.             
  105.             Tcnt[ ID_BAG_CUT_DLY ] := -255;
  106.             Tcnt[ ID_BAG_CUT ] := Param_Cut;
  107.             SET( TRUE, Y_Cutter_Print_cylinder );          
  108.             
  109.         END_IF;    
  110.         
  111.         IF( Tcnt[ ID_BAG_CUT ]  = 0 ) THEN
  112.             
  113.             Tcnt[ ID_BAG_CUT ] := -255;
  114.             Tcnt[ ID_VACUUMIZE ] := Param_Vacuum;
  115.             RST( TRUE, Y_Cutter_Print_cylinder );
  116.             SET( TRUE, Y_VacuumPump_Y5 );
  117.             SET( TRUE, Y_Vacuum_cylinder );
  118.             
  119.         END_IF;    
  120.               
  121.     END_IF;
  122.     (* 包装袋抽真空、封口,恒温,冷却 *)
  123.     IF( Tcnt[ ID_VACUUMIZE ] = 0 ) THEN           (* 抽真空 *)
  124.         
  125.         Tcnt[ ID_VACUUMIZE ] := -255;
  126.         Tcnt[ ID_HEAT_SEAL ] := Param_HeatSeal;
  127.         SET( TRUE, Y_HoriSeal_cylinder );
  128.         
  129.     END_IF;
  130.     
  131.     IF( Tcnt[ ID_HEAT_SEAL ] = 0 ) THEN           (* 热封 *)
  132.         Tcnt[ ID_HEAT_SEAL ] := -255;
  133.         Tcnt[ ID_SEAL_KEEP ] := Param_SealKeep;
  134.         RST( TRUE, Y_HoriSeal_cylinder );
  135.     END_IF;
  136.     
  137.     IF( Tcnt[ ID_SEAL_KEEP ] = 0 ) THEN           (* 恒温保持 *)
  138.         Tcnt[ ID_SEAL_KEEP ] := -255;
  139.         Tcnt[ID_SEAL_COOL ] := Param_SealCool;
  140.         SET( TRUE, Y_AirIn_cylinder );
  141.     END_IF;
  142.     
  143.     IF( Tcnt[ID_SEAL_COOL ] = 0 ) THEN            (* 冷却等待 *)
  144.         RST( TRUE, Y_VacuumBox_Y3 );
  145.         RST( TRUE, Y_Vacuum_cylinder );
  146.         RST( TRUE, Y_AirIn_cylinder );
  147.         PackingFlow := FLOW_END;
  148.     END_IF;
  149.     
  150.     (* 每分钟为60000ms,程序扫描周期为5ms,每分钟的计数值为60000 / 5 = 12000 *)
  151.     IF( Cnt < 11999 ) THEN
  152.         Cnt := Cnt + 1;
  153.     END_IF;
  154.         
  155.     IF( PackingFlow = FLOW_END  ) AND ( HmiKey_FillPack[1]  ) THEN
  156.     
  157.         MakeBagCnt := MakeBagCnt + 1;             (* 制袋计数 *)
  158.         PackingCnt := PackingCnt + 1;             (* 包装计数 *)
  159.         PackingSpeed := 12000 / Cnt;              (* 包装速度计算 *)
  160.         Cnt := 0;
  161.         
  162.     END_IF;
  163.     
  164.     IF( PackingFlow = FLOW_END ) AND ( HmiKey_EmptyBagTest[1]  OR  HmiKey_FillBagOne[1] )  THEN
  165.         
  166.         MakeBagCnt := MakeBagCnt + 1;             (* 制袋计数 *)
  167.         PackingSpeed := 12000 / Cnt;
  168.         Cnt := 0;
  169.                 
  170.     END_IF;
  171.     (* 包装流程结束,复位定时器、伺服结束标志、制袋一个按钮 *)
  172.     IF( PackingFlow = FLOW_END  ) THEN  
  173.         
  174.         PackingFlow := 0;
  175.         RST( TRUE, bServo_End );
  176.         RST( TRUE, HmiKey_FillBagOne[0] );
  177.         FOR j := 0 TO 30 BY 1 DO
  178.             Tcnt[j] := -1;
  179.         END_FOR;
  180.               
  181.     END_IF;
  182.                 
  183. END_IF;
  184. (*****************************************************************************************************
  185. * 包装膜卷棍电机控制
  186. *
  187. * 说明:接近开关的感应体是一个自由落体的金属横杆,由包装膜拉动其上下运动表示包装膜的松紧。
  188. *       感应体运动到顶部,顶部金属感应开关动作,说明包装膜被拉紧,包装膜卷棍电机运转送膜;
  189. *       感应体运动到中部,中部金属感应开关动作,说明送膜已经足够,停止送膜;
  190. *       感应体运动到底部,底部金属感应开关动作,说明接近开关的感应体已经没有包装膜拉动其运动,
  191. *       或者送膜太多,感应体自由落体到底部
  192. ****************************************************************************************************)
  193. IF bMode_Auto THEN
  194.     
  195.     IF( ix_PackFilm_SensorTop  ) THEN
  196.         
  197.         SET( TRUE, Y_FilmMotor_Y13 ); (* 送膜 *)
  198.         
  199.     ELSIF( ix_PackFilm_SensorMid OR ix_PackFilm_SensorBot )  THEN
  200.         
  201.         RST( TRUE, Y_FilmMotor_Y13 ); (* 送膜停止 *)
  202.         
  203.     END_IF;  
  204.     
  205. END_IF;
  206. (* 手动控制,放膜 *)
  207. IF HmiKey_ManualOP THEN
  208.     
  209.     IF( HMI手动_放膜 ) THEN
  210.         
  211.         SET( TRUE, Y_FilmMotor_Y13 ); (* 手动送膜 *)
  212.         
  213.     ELSE  
  214.         
  215.         RST( TRUE, Y_FilmMotor_Y13 );    
  216.         
  217.     END_IF;
  218.     
  219. END_IF;
[ 此帖被nos001在2019-07-04 17:38重新编辑 ]
附件: 结构化文本(ST)编程指南-1802.pdf (1477 K) 下载次数:937
网站提示: 请不要用迅雷下载附件,容易出错
附件: 颗粒包装机v1.0_ST.gxw.rar (180 K) 下载次数:751
网站提示: 请不要用迅雷下载附件,容易出错
本帖最近评分记录:
  • 下载积分:+1(gk1234) 感谢分享!
  • 下载积分:+1(lizhendong) 感谢分享!
  • 下载积分:+1(xn0220xn) 真诚感谢!
  • 下载积分:+1(chihung) 感谢分享!
  • 下载积分:+5(吴工2014)
  • 下载积分:+1(zhcdb2671) 真诚感谢!
  • 下载积分:+3(heidelberg5) 好贴好贴!
    枫落云端
    施主,脚抬一下
    级别: 略有小成

    精华主题: 0
    发帖数量: 341 个
    工控威望: 465 点
    下载积分: 1590 分
    在线时间: 408(小时)
    注册时间: 2017-10-10
    最后登录: 2024-04-19
    查看枫落云端的 主题 / 回贴
    1楼  发表于: 2019-06-27 17:11
    图片:
    图片:
    图片:
    ------------------------
    本帖最近评分记录:
  • 下载积分:+5(菜鸟入行) 感谢分享!
    nos001
    级别: 探索解密
    精华主题: 0
    发帖数量: 54 个
    工控威望: 110 点
    下载积分: 814 分
    在线时间: 42(小时)
    注册时间: 2018-03-31
    最后登录: 2022-10-06
    查看nos001的 主题 / 回贴
    2楼  发表于: 2019-06-27 19:32
    引用
    引用第1楼枫落云端于2019-06-27 17:11发表的  :
    ------------------------

    楼主神人,把输出语句改写了。我说奇怪呢,明明我程序不是这样啊,原来是改写了。
    不过我不喜欢软件自带的指令,尽量以C语言的格式来写,方便阅读。
    枫落云端
    施主,脚抬一下
    级别: 略有小成

    精华主题: 0
    发帖数量: 341 个
    工控威望: 465 点
    下载积分: 1590 分
    在线时间: 408(小时)
    注册时间: 2017-10-10
    最后登录: 2024-04-19
    查看枫落云端的 主题 / 回贴
    3楼  发表于: 2019-06-28 09:38
    只是看起来一个指令解决的事情非得写一IF ELSE,而且还出现双线圈提示。个人习惯
    我看到你了
    级别: 家园常客
    精华主题: 0
    发帖数量: 375 个
    工控威望: 619 点
    下载积分: 490 分
    在线时间: 156(小时)
    注册时间: 2018-05-02
    最后登录: 2023-09-22
    查看我看到你了的 主题 / 回贴
    4楼  发表于: 2019-06-28 10:06
    全是if else...而且还中英混搭,何必呢
    mall9002
    级别: 略有小成
    精华主题: 0
    发帖数量: 136 个
    工控威望: 247 点
    下载积分: 919 分
    在线时间: 181(小时)
    注册时间: 2017-11-30
    最后登录: 2024-04-07
    查看mall9002的 主题 / 回贴
    5楼  发表于: 2019-06-28 11:03
    还是习惯用FBD,ST编逻辑逻辑看着太累,出问题找半天,梯形图一竿子到底,不利于阅读。
    变量在程序里输入完标签名称按F2就出来了,还行吧。
    nos001
    级别: 探索解密
    精华主题: 0
    发帖数量: 54 个
    工控威望: 110 点
    下载积分: 814 分
    在线时间: 42(小时)
    注册时间: 2018-03-31
    最后登录: 2022-10-06
    查看nos001的 主题 / 回贴
    6楼  发表于: 2019-06-28 16:32
    引用
    引用第4楼两只橙于2019-06-28 10:06发表的  :
    全是if else...而且还中英混搭,何必呢

    混搭标签容易辨识,就是写的时候难受。
    软件自带的指令与函数,逻辑开关写成一长串,怎么阅读啊。
    写单片机程序习惯了,所以只用SET、RST这样简单的指令,主要便于阅读。
    nos001
    级别: 探索解密
    精华主题: 0
    发帖数量: 54 个
    工控威望: 110 点
    下载积分: 814 分
    在线时间: 42(小时)
    注册时间: 2018-03-31
    最后登录: 2022-10-06
    查看nos001的 主题 / 回贴
    7楼  发表于: 2019-06-28 17:00
    引用
    引用第3楼枫落云端于2019-06-28 09:38发表的  :
    只是看起来一个指令解决的事情非得写一IF ELSE,而且还出现双线圈提示。个人习惯

    层主是大神。
    OUT指令其实是照搬梯形图,优点是简洁。但一旦控制逻辑复杂,那读起来真是头晕眼花。
    用条件语句来写的缺点就是条件为非时,线圈不能像OUT指令那样跟随条件变化,而要多出ELSE语句,是照搬单片机的C语言写法。
    两种写法可谓各有优缺点。
    至于双线圈警告,可以在选项设置里勾选“SET指令不是双线圈的检查对象”。
    昆山博元电气
    自动化控制柜、非标设备自动化设计。。。
    级别: 探索解密
    精华主题: 0
    发帖数量: 58 个
    工控威望: 116 点
    下载积分: 2601 分
    在线时间: 15(小时)
    注册时间: 2019-06-18
    最后登录: 2020-03-27
    查看昆山博元电气的 主题 / 回贴
    8楼  发表于: 2019-06-28 22:38
    就可读性而言,除了个人习惯原因以外,就整体程序并没有说PLC编程语言有哪一种能完全碾压另外一种的说法,
    关于梯形图、结构化还有ST的优劣各大论坛已经讨论过很多次了,这跟那个大佬发帖狠怼PLC垃圾,未来发展趋势是单片机天下
    有异曲同工
    江浙沪非标设备自动化设计制作、自动化控制柜制作及销售、程序设计...18550928952微信同号
    淘宝店铺 w2wz.com/grmj
    云生冰寒
    级别: 正式会员
    精华主题: 0
    发帖数量: 36 个
    工控威望: 87 点
    下载积分: 802 分
    在线时间: 15(小时)
    注册时间: 2019-05-30
    最后登录: 2023-05-19
    查看云生冰寒的 主题 / 回贴
    9楼  发表于: 2019-07-02 13:55
    混搭标签容易辨识,就是写的时候难受。
    软件自带的指令与函数,逻辑开关写成一长串,怎么阅读啊。
    写单片机程序习惯了,所以只用SET、RST这样简单的指令,主要便于阅读。
    我看到你了
    级别: 家园常客
    精华主题: 0
    发帖数量: 375 个
    工控威望: 619 点
    下载积分: 490 分
    在线时间: 156(小时)
    注册时间: 2018-05-02
    最后登录: 2023-09-22
    查看我看到你了的 主题 / 回贴
    10楼  发表于: 2019-07-02 14:24
    引用
    引用第6楼nos001于2019-06-28 16:32发表的  :

    混搭标签容易辨识,就是写的时候难受。
    软件自带的指令与函数,逻辑开关写成一长串,怎么阅读啊。
    写单片机程序习惯了,所以只用SET、RST这样简单的指令,主要便于阅读。


    我知道..个人喜好吧。

    我就是觉得你是直接把梯形图用if else翻译过来,而且一个条件就占一行,那屏幕得多大才够看,中英文混合写代码过程中还得频繁切换输入
    学海无涯333
    级别: 探索解密
    精华主题: 0
    发帖数量: 62 个
    工控威望: 154 点
    下载积分: 782 分
    在线时间: 18(小时)
    注册时间: 2017-07-16
    最后登录: 2020-03-30
    查看学海无涯333的 主题 / 回贴
    11楼  发表于: 2019-12-07 16:35
    谢谢分享
    • «
    • 1
    • 2
    • 3
    • »
    • Pages: 1/3     Go