【资料图】
西门子S7通信为品牌内部的通信方式。借由此,各个系列的CPU可建立或单边或双边的通道从而建立通信。对于LAD形式的S7通信已有详细的介绍,本文仅通过SCL实现S7通信的方式来介绍使用SCL编写项目程序。(附:LAD实现S7通信西门子官方链接。)
https://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/SmartSMS/021.html
首先要明确的是S7通信是立足于TCP层的通信协议,实际的交讯需要连接网线。而后,在本地PC端确认参与此次通信的多台CPU在同一网段内响应。
在Portal内组态多台CPU,开放CPU→→属性→→常规→→防护与安全→→连接机制→→来自其他远程对象的PUT/GET通信访问,设备和网络的组态画面内将各个CPU连接在同一个子网。 新建FB_PUT_GET底层块,调用通信库内 GET 和 PUT 的多重实例(仅显示分配参数),点击#GET_Instance AND #PUT_Instance 组态实例的块参数和连接参数,匹配对应的CPU。(200smart不支持双边通信)到此,PUT / GET 实例中就会自动映射出当前连接设备的ID参数。
#PUT_Instance(ID := W#16#100, //用于指定与伙伴 CPU 连接的寻址参数。 ADDR_1 := #rePutRemoteAAddr, //指向伙伴 CPU 上用于写入数据的区域的指针。 // 指针 REMOTE 访问某个数据块时,必须始终指定该数据块。 //示例:P#DB10.DBX5.0 字节 10。 //传送数据结构(例如 Struct)时,参数 ADDR_i 处必须使用数据类型 CHAR。 SD_1 := #varPutLocadAddr //指向本地 CPU 上包含要发送数据的区域的指针。 //仅支持 BOOL、BYTE、CHAR、WORD、INT、DWORD、DINT 和 REAL 数据类型。 //传送数据结构(例如 Struct)时,参数 SD_i 处必须使用数据类型 CHAR。 );以上为已经组态好的PUT实例。
(****************状态参数 NDR: 0:作业尚未开始或仍在运行。1:作业已成功完成。******************)IF NOT #GET_Instance.REQ AND (#GET_Instance.NDR OR #GET_Instance.ERROR OR NOT #NC) THEN //GET指令未请求 上次GET执行DONE GET执行报错中 单次执行标志位 #GET_Instance.REQ := 1; //执行GET指令END_IF;IF #GET_Instance.NDR THEN //GET执行DONE #bGetDone := TRUE; //GET指令DONE标志位 #GET_Instance.REQ := 0; //GET使能复位END_IF;IF #GET_Instance.ERROR OR #GET_Instance.STATUS=25 THEN //GET指令报错 GET指令通信状态正常标志位 #bGetDone := FALSE; //GET指令DONE标志位 #GET_Instance.REQ := 0; //GET使能复位END_IF;IF (#GET_Instance.STATUS=0 AND NOT #GET_Instance.NDR) THEN //执行成功时,输出参数 NDR(“done”)处的信号状态为“TRUE”,且输出参数 STATUS //(“status”)的值为“16#0000”。 #GET_Instance.REQ := NOT #GET_Instance.REQ; //GET使能状态取反END_IF;//PUTIF #PUT_Instance.REQ = 0 THEN //PUT指令使能标志位 IF #PUT_Instance.DONE OR #PUT_Instance.ERROR OR NOT #NC THEN //PUT指令DONE PUT指令报错标志位 #PUT_Instance.REQ := 1; //PUT指令使能 END_IF;END_IF;IF #PUT_Instance.DONE THEN //PUT指令DONE信号 #bPutDone := TRUE; //PUT指令完成标志位 #PUT_Instance.REQ := 0; //PUT指令使能复位END_IF;IF (#PUT_Instance.ERROR OR #PUT_Instance.STATUS=25) AND #PUT_Instance.REQ THEN //如果(报警 或者 已开始通信。作业正在处理。) 与PUT指令使能信号 #bPutDone := FALSE; //PUT指令完成信号复位 #PUT_Instance.REQ := 0; //PUT指令使能复位END_IF;IF (#PUT_Instance.STATUS = 0 AND NOT #PUT_Instance.DONE) THEN //执行成功时,输出参数 DONE(“done”)处的信号状态为“TRUE”,且输出 //参数 STATUS(“status”)的值为“16#0000”。 #PUT_Instance.REQ := NOT #PUT_Instance.REQ; //PUT指令使能取反END_IF;//Error//GET/PUT指令报错标志位及报警信息赋值 IF #GET_Instance.ERROR OR #PUT_Instance.ERROR THEN #bError := TRUE; IF #GET_Instance.ERROR THEN #wErrorID := #GET_Instance.STATUS; END_IF; IF #PUT_Instance.ERROR THEN #wErrorID := #PUT_Instance.STATUS; END_IF;ELSE #wErrorID := 0; #bError := FALSE;END_IF;IF NOT #NC THEN #NC := 1;END_IF;底层块FB_PUT_GET结束。
另外新建通信时钟块FB_Heart用以反馈通信状态异常与否。#IEC_Timer_0_Instance_2(IN := NOT #bInHeart, PT := t#1m);//1分钟无响应报警时钟#IEC_Timer_0_Instance_1(IN := #bInHeart, PT := t#1m);IF #IEC_Timer_0_Instance_1.Q OR #IEC_Timer_0_Instance_2.Q THEN // Statement section IF #bTimeOut := 1;ELSE #bTimeOut := 0;END_IF;#bOutHeart := "Clock_1Hz";开放#bInHeart变量与伙伴CPU的心跳信号绑定,反馈当前通信状态。通信时钟块FB_Heart结束。
所有底层块编写结束。新建与伙伴CPU交互的数据块以及调用底层的应用块。通信的状态可以自建结构体将错误代码和完成信号输出储存。
#PUT_GET_Instance(wID := 16#100, bGetDone => "FB_S7ComunicateData".PLC_STATUS.bGetDone, bPutDone => "FB_S7ComunicateData".PLC_STATUS.bPutDone, bError => "FB_S7ComunicateData".PLC_STATUS.通讯错误, wErrorID => "FB_S7ComunicateData".PLC_STATUS.错误代码, reGetRemoteAddr := P#DB1.DBx400.0 WORD 111, varGetLocadAddr := P#DB32.DBX0.0 WORD 111, rePutRemoteAAddr := P#DB1.DBX436.0 WORD 95, varPutLocadAddr := p#db32.dbx224.0 WORD 95);#heart_Instance(bInHeart := "FB_S7ComunicateData".Bool信号只读.心跳信号, bOutHeart => "FB_S7ComunicateData".Bool信号只写.心跳信号, bTimeOut => "FB_S7ComunicateData".PLC_STATUS.心跳超时);应用块使用指针将 PUT / GET 引至目标数据地址并标记数据长度。此处的索引地址和实际数据块的数据内容长度须保持一致,且数据块不可以使用优化的块访问功能。应用块结束。
需要特别注意的是S7-200SMART作为伙伴CPU有几点特殊项。1.200smart作为伙伴CPU只支持S7单边通信;2.200smart的数据类型与现有大多数的西门子CPU不能完全对应,数据交互需要考虑类型因素;3.200smart的所有V寄存器在本地设备的索引映射均为DB1。
以上,希望对你有所帮助。
X 关闭