技术论坛

分享一个SMC电缸MODBUS通讯控制

作者 主题
侠客

经验值: 802
发帖数: 29
精华帖: 2
主题:【分享】分享一个SMC电缸MODBUS通讯控制
推荐帖 推荐帖


只看楼主 楼主 2018-07-27 17:59:35


小弟不才,才接触西门子3个多月,由于公司要求全线用西门子的电控,临时学习的,刚好又用到一个SMC电缸的控制,本人嫌接线麻烦又是走开环控制,故采用了MODBUS的方式来控制。

再论坛上找了好多MODBUS通讯的写法,都不适合开关量,数据量同时轮询。自己尝试研究了半个月写出来的。写的不好大家可以指点下,这个程序已经试运行过可以用的


SCL代码

//===========================================================================================================================

//1、上升沿信号  R_TRIG

IF #V.Output.位状态.X_电缸使能 AND NOT #V.Output.X_通讯错误 THEN

    #R_TRIG[0](CLK := #V.input.X_电缸动作 AND NOT #电缸Output读取.位状态.X_运行中 AND #IN号 = #V.input.X_IN号);

    #R_TRIG[1](CLK := #V.input.X_故障清除 AND NOT #电缸Output读取.位状态.X_运行中);

    #R_TRIG[2](CLK := #V.input.X_回原点 AND NOT #电缸Output读取.位状态.X_运行中);

    #R_TRIG[4](CLK := #V.input.X_通讯重启 AND NOT #电缸Output读取.位状态.X_运行中);

    #R_TRIG[5](CLK := #V.input.X_电缸动作);

END_IF;

//--------------------------------------------------------------------------------------------------------------------------

//2、通讯参数设置

IF #FirstScan OR (#R_TRIG[4].Q AND #V.Output.X_通讯错误) THEN

    #Modbus_Comm_Load.MODE := 4;

    #Modbus_Comm_Load.REQ := 1;

    #V.Output.X_通讯错误 := 0;

    #i := 0;

END_IF;

#Modbus_Comm_Load("PORT" := #PORT,

                  BAUD := 38400,

                  RESP_TO := 1000,

                  MB_DB := #Modbus_Master主站.MB_DB);

//3、通讯启动

IF NOT #V.Output.X_通讯错误 AND #Modbus_Comm_Load.DONE OR (#TON_TIME.Q AND NOT #Modbus_Master主站.BUSY) THEN

    #Modbus_Master主站.REQ := TRUE;

    #启动延时 := FALSE;

    IF #Modbus_Comm_Load.REQ = 1 THEN

        #Modbus_Comm_Load.REQ := 0;

    END_IF;

END_IF;

//--------------------------------------------------------------------------------------------------------------------------

//4、MODBUS通讯主站参数地址

#Modbus_Master主站.MB_ADDR := #Request[#i].站号;

#Modbus_Master主站.MODE := #Request[#i].方式;

#Modbus_Master主站.DATA_ADDR := #Request[#i].地址;

#Modbus_Master主站.DATA_LEN := #Request[#i].长度;

#Modbus_Master主站(DATA_PTR := #Request[#i].传送数据);

IF #Modbus_Master主站.ERROR THEN

    #V.Output.X_通讯错误代码 := #Modbus_Master主站.STATUS;

    #V.Output.X_通讯错误 := TRUE;

    #V.InOut.动作号 := 0;

END_IF;

//通讯结束后延时时间30ms启动下次轮询

#TON_TIME(IN := #启动延时,

          PT := t#30ms);

//=================================================================================================================================

FOR #A := 0 TO 2 DO//判断 X_电缸动作、X_故障清除、X_回原点上沿条件

    IF #R_TRIG[#A].Q THEN

        #V.InOut.动作号 := 500;

        #Request[5].传送数据[#A] := 1;

        EXIT;

    END_IF;

END_FOR;

//----------------------------------------------------------------------------------------------------------------------------------

IF #R_TRIG[5].Q THEN

    #电缸Output读取.位状态.X_动作到位 := 0;

END_IF;

//IN号判读

IF #IN号 <> #V.input.X_IN号 AND NOT #电缸Output读取.位状态.X_运行中 AND #V.InOut.动作号>0 THEN

    #V.InOut.动作号 := 400;

END_IF;

//5、动作流程树

IF #Modbus_Master主站.DONE THEN

    #Modbus_Master主站.REQ := FALSE;

    #启动延时 := 1;

    //-----------------------------------------------------------------------------------------------------------------------

    //#i:= 值代表含义

    //0 开启电缸通讯的地址写入地址位

    //1 电缸使能通讯地址

    //2 电缸位状态读取

    //3 电缸字状态读取

    //4 IN号修改写入

    //5 X_电缸动作、X_故障清除、X_回原点状态条件写入

    //------------------------------------------------------------------------------------------------------------------------

    IF NOT #V.input.X_模式选择 AND NOT #电缸Output读取.位状态.X_运行中 THEN//电缸动作相应参数设置判断

        FOR #B := 0 TO 3 DO

            IF "电缸Static".参数待写区[#B] <> #电缸参数[#B] THEN

                "电缸Static".参数待写区[#B] := #电缸参数[#B];

                FOR #A := 0 TO 31 DO

                    POKE(area := 16#84,

                         dbNumber := #DB地址,

                         byteOffset := 2692 + (#B * 42) + #A,

                         value := PEEK(area := 16#84, dbNumber := 7, byteOffset := 0 + (#B * 32) + #A));

                END_FOR;

                #i := 6 + #B;

                #V.InOut.动作号 := 100;

                EXIT;

            ELSE

                IF #V.InOut.动作号 = 100 THEN

                    #V.InOut.动作号 := 200;

                    #i := 2;

                END_IF;

            END_IF;

        END_FOR;

    END_IF;

    //------------------------------------------------------------------------------------------------------------------------

    CASE #V.InOut.动作号 OF

        0:

            IF #i = 0 THEN//开启电缸通讯的地址写入地址位

                #i := 1;

            ELSIF #i = 1 THEN//电缸使能通讯地址

                #i := 2;

                #V.InOut.动作号 := 200;

            END_IF;

        200://电缸位状态读取

            FOR #B := 0 TO 1 DO

                POKE(area := 16#84,

                     dbNumber := #DB地址,

                     byteOffset := 2414 + #B,

                     value := PEEK(area := 16#84, dbNumber := #DB地址, byteOffset := 2524 + #B));

            END_FOR;

                #V.InOut.动作号 := 300;

                #i := 3;

        300://电缸字状态读取

            FOR #B := 0 TO 14 DO

                POKE(area := 16#84,

                     dbNumber := #DB地址,

                     byteOffset := 2416 + #B,

                     value := PEEK(area := 16#84, dbNumber := #DB地址, byteOffset := 2566 + #B));

            END_FOR;

            #V.InOut.动作号 := 200;

            #i := 2;

        400://IN位修改参数写入

            #IN号 := #V.input.X_IN号;

            POKE(area := 16#84,

                 dbNumber := #DB地址,

                 byteOffset := 2608,

                 value := PEEK(area := 16#84, dbNumber := #DB地址, byteOffset := 2412));

            #i := 4;

            #V.InOut.动作号 := 410;

        410://IN写入后判断是否连续动作

            IF NOT #V.input.X_电缸动作 THEN

                #V.InOut.动作号 := 200;

                #i := 2;

            END_IF;

        500:// X_电缸动作、X_故障清除、X_回原点状态条件写入

            #i := 5;

            #V.InOut.动作号 := 510;

        510:// X_电缸动作、X_故障清除、X_回原点状态条件判断若有处于开启状态进行复位

            IF #Request[5].传送数据[0] OR #Request[5].传送数据[1] OR #Request[5].传送数据[2] THEN

                #Request[5].传送数据[0] := FALSE;

                #Request[5].传送数据[1] := FALSE;

                #Request[5].传送数据[2] := FALSE;

            ELSE

                #i := 2;

                #V.InOut.动作号 := 200;

            END_IF;

    END_CASE;

END_IF;

//电缸状态读取后输出

#V.Output.位状态 := #电缸Output读取.位状态;

#V.Output.字状态 := #电缸Output读取.字状态;

SMC电缸MODBUS通讯控制.zip



 
推荐帖推荐理由: 实践是最好的老师。 (推荐人:西门子w)
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1498944&b_id=50&s_id=0&num=17

奇侠

经验值: 7405
发帖数: 1268
精华帖: 3
回复:分享一个SMC电缸MODBUS通讯控制
推荐帖


只看楼主 1楼 2018-07-27 20:39:48

谢谢楼主分享 赞一个


新手到来 多多指教
以下网友喜欢您的帖子:

  
至圣

经验值: 18884
发帖数: 2107
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制
推荐帖


只看楼主 2楼 2018-07-28 10:15:02

下载看看,多多学习!


 
以下网友喜欢您的帖子:

  
至圣

经验值: 18401
发帖数: 2409
精华帖: 1
回复:分享一个SMC电缸MODBUS通讯控制
推荐帖


只看楼主 3楼 2018-07-28 15:12:21


感谢楼主分享


 
以下网友喜欢您的帖子:

  
侠客

经验值: 802
发帖数: 29
精华帖: 2
回复:分享一个SMC电缸MODBUS通讯控制
推荐帖


只看楼主 楼主 4楼 2018-07-28 22:54:59
其实稍微改下程序就可以应用于其他轮训的。为啥没人顶呢
 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7358
发帖数: 817
精华帖: 5
回复:分享一个SMC电缸MODBUS通讯控制
推荐帖


只看楼主 5楼 2018-07-29 10:59:43

MODBUS通信程序用SCL语言编写,的确很方便,有功底。


办法总比困难多
以下网友喜欢您的帖子:

  
奇侠

经验值: 9046
发帖数: 375
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 6楼 2018-07-29 16:26:46


写的不错,分享了


随心所欲
以下网友喜欢您的帖子:

  
侠客

经验值: 884
发帖数: 22
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制
推荐帖


只看楼主 7楼 2018-07-29 19:39:46


分享是美德,谢谢楼主的无私分享


 
以下网友喜欢您的帖子:

  
侠士

经验值: 1255
发帖数: 77
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 8楼 2018-07-30 09:23:41

可以啊,才接触3个月,真是高材生啊


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3904
发帖数: 370
精华帖: 1
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 9楼 2018-07-30 11:54:44

留个脚印,慢慢学习


无法改变之前,努力改变之后
以下网友喜欢您的帖子:

  
侠圣

经验值: 2551
发帖数: 299
精华帖: 3
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 10楼 2018-10-25 09:03:58

分享程序是美德,无论什么样的程序都值得尊重,比那些整天总在论坛里吆喝挣钱的主强多了,总觉得自己超凡脱俗。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5430
发帖数: 553
精华帖: 9
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 11楼 2018-10-29 20:58:58
以下是引用kayan在2018-10-25 09:03:58的发言 >10楼

分享程序是美德,无论什么样的程序都值得尊重,比那些整天总在论坛里吆喝挣钱的主强多了,总觉得自己超凡脱俗。

说的好,谢谢楼主分享


 
以下网友喜欢您的帖子:

  
侠客

经验值: 793
发帖数: 34
精华帖: 1
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 12楼 2018-10-31 08:36:55


谢前辈无私奉献,好贴就要有人顶才行。


无法容忍自己没有进步
以下网友喜欢您的帖子:

  
侠士

经验值: 1012
发帖数: 80
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 13楼 2018-10-31 08:55:28

收藏了,谢谢


有志者事竟成
以下网友喜欢您的帖子:

  
侠士

经验值: 1129
发帖数: 141
精华帖: 4
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 14楼 2018-10-31 09:05:00


值得学习尊敬。


学无止境
以下网友喜欢您的帖子:

  
侠士

经验值: 1173
发帖数: 44
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 15楼 2018-10-31 20:58:00


值得学习尊敬。


做好自己的事...........
以下网友喜欢您的帖子:

  
游民

经验值: 87
发帖数: 7
精华帖: 0
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 16楼 2018-11-01 09:29:58


谢谢楼主!



 
以下网友喜欢您的帖子:

  
侠客

经验值: 802
发帖数: 29
精华帖: 2
回复:分享一个SMC电缸MODBUS通讯控制


只看楼主 楼主 17楼 2018-11-01 16:13:58

哈哈,有这么多人认可还是蛮开心的。。虽然写的还不够完美。


 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
分享一个SMC电缸MODBUS通讯控制
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。