西门子SCL---Tcp/ip通信

来源: 腾讯云 时间:2022-12-06 19:08:44


(相关资料图)

S7-1200支持标准TCP协议,可以作为客户端和服务器与其他设备或软件进行TCP通信。通过调用TSEND_C、TRCV_C、TCON等指令可以与通信伙伴建立TCP的连接。在PC上使用网络调试助手与S7-1200建立TCP通信是一种简便的调试方法。``` 鉴于西门子官网对于LAD形式的通信已有详细的介绍,本文仅通过SCL实现TCP通信的方式来介绍使用SCL编写项目程序。(附:LAD实现TCP通信链接。)

https://www.ad.siemens.com.cn/productportal/Prods/S7-1200_PLC_EASY_PLUS/11-Comm/01-Ethernet/03-TCP/03-3rd_party.html

PC端在确认与TCP下游设备交互正常以后,项目内新建FB\_Tcp底层块调用TSEND\_C、TRCV\_C指令块。1.需设置IP与端口号2.使能会先建立连接  收到反馈后是一直循环通讯状态 断掉使能后连接也会释放3.#Connect.ActiveEstablished: true:客户端 (Client)  false:服务器 (Server)Server时 RemotePort:=0
底层块定义输入
1.TCON_IP_v4:包括建立指定连接时所需的所有地址参数。使用 TCON_IP_v4 时,可通过调用指令“MB_CLIENT”建立连接;2.TCON_Configured:包括所组态连接的地址参数。使用 TCON_Configured 时,将使用下载硬件配置后由 CPU 创建的已有连接。

本文TSEND_C、TRCV_C指令connect脚使用 TCON_IP_v4 数据类型参数。包含有IP、设备ID、硬件标识符以及设备端口号等等。底层程序编写开放上述各参数,方便后续调用。

#Connect_Instance.ID := #ID;         #Connect_Instance.InterfaceId := #InterfaceId;         #Connect_Instance.LocalPort := #LocalPort;         IF #ActiveEstablished THEN             #Connect_Instance.RemotePort := #RemotePort;         ELSE             #Connect_Instance.RemotePort := 0;         END_IF;         #Connect_Instance.ConnectionType := 16#0b;         #Connect_Instance.ActiveEstablished := #ActiveEstablished;         #Connect_Instance.RemoteAddress.ADDR[1] := #"ADDR[1]";         #Connect_Instance.RemoteAddress.ADDR[2] := #"ADDR[2]";         #Connect_Instance.RemoteAddress.ADDR[3] := #"ADDR[3]";         #Connect_Instance.RemoteAddress.ADDR[4] := #"ADDR[4]";
根据 TSEND_C、TRCV_C指令各个引脚对需要开放出来的各个参数在底层块作出申明。
底层块其他变量申明
FOR #inNumberTemp := 1 TO LEN(#strSendData) BY 1 DO    #arrSendDataTemp[#inNumberTemp - 1] := #strSendData#inNumberTemp;END_FOR;#R_TRIG_Instance(CLK:=#bSendUp);IF #bConnectDone THEN    #TSEND_Instance(REQ := #bSendUp,                    ID := #Connect_Instance.ID,                    LEN := INT_TO_UDINT(LEN(#strSendData) + 1),                    DATA := #arrSendDataTemp);        IF #R_TRIG_Instance.Q THEN             #bSendDone := FALSE;        END_IF;END_IF;IF #TSEND_Instance.DONE THEN       #bSendDone := true;END_IF;IF #TSEND_Instance.BUSY OR #TSEND_Instance.ERROR THEN        #bSendDone := FALSE;END_IF;#TRCV_C_Instance(EN_R := true,                 CONT := NOT #bDisConnect AND NOT #bDisConnect_Instance,                 LEN := 0,  //优化的块地址为0,非优化为最大长度                 ADHOC := TRUE,                 CONNECT:=#Connect_Instance,                 DATA := #arrReceiveDataT_Instance);
IF #TRCV_C_Instance.DONE THEN         #strReceiveData := "";         FOR #inNumberTemp := 0 TO UDINT_TO_INT(#TRCV_C_Instance.RCVD_LEN) - 1 BY 1 DO                #strReceiveData := CONCAT(IN1 := #strReceiveData, IN2 := #arrReceiveDataT_Instance[#inNumberTemp]);         END_FOR;         #bReceiveDone := true;END_IF;
IF #TRCV_C_Instance.ERROR THEN             #bReceiveDone := FALSE;     END_IF;
IF  #TSEND_Instance.ERROR OR  #TRCV_C_Instance.ERROR THEN             #bError := TRUE;         IF #TSEND_Instance.ERROR THEN             #wErrorID := #TSEND_Instance.STATUS;         END_IF;         IF #TRCV_C_Instance.ERROR THEN              #bDisConnect_Instance := TRUE;              #wErrorID := #TRCV_C_Instance.STATUS;         END_IF;ELSE         #bError := FALSE;         #wErrorID := 0;END_IF;
IF NOT #TRCV_C_Instance.ERROR THEN    #bDisConnect_Instance := false;END_IF;
IF #TSEND_Instance.STATUS = 16#7004 OR #TSEND_Instance.STATUS = 16#7005OR #TRCV_C_Instance.STATUS = 16#7004 OR #TRCV_C_Instance.STATUS = 16#7006 THEN    #bConnectDone := TRUE;ELSE    #bConnectDone := FALSE;END_IF;

底层块FB_Tcp软体结束。

新建调用块FB_Tcp_Invocation,如下所示“对号入座”即可以

.`

#FB_TcpInstance(InterfaceId:=#InterfaceId,                ID:=#ID,                ActiveEstablished:=#ActiveEstablished,                "ADDR[1]":=#"ADDR[1]",                "ADDR[2]":=#"ADDR[2]",                "ADDR[3]":=#"ADDR[3]",                "ADDR[4]":=#"ADDR[4]",                RemotePort:=#RemotePort,                LocalPort:=#LocalPort,                bSendDone:=#Status.bSendDone,                bReceiveDone:=#Status.bReceiveDone,                strReceiveData:=#Status.strReceiveData,                bConnectDone=>#Status.bConnectDone,                bError=>#Status.bError,                wErrorID=>#Status.wErrorID);
调用样例
如上图,建立对应变量后即可完成多个设备的TCP通信调用。希望可以帮助到你。

感谢看到这里,谢谢

上一篇:

下一篇:

X 关闭

热门推荐

西门子SCL---Tcp/ip通信

2022-12-06   腾讯云

建筑界的“奥斯卡”!张家口入选!

2022-12-06   张家口新闻网

宫所有歌曲(宫所有歌曲)

2022-12-06   万能网

聘上“烘烤师” 串起“生产链”

2022-12-06   中国产业经济信息网

本土新增“4988+22859”

2022-12-06   人民网科普

国货品牌:锚定高质量锻造硬实力-天天报道

2022-12-06   中国产业经济信息网

技术创新让中国汽车品牌“走红”中东

2022-12-06   中国产业经济信息网

国内首条齿轨列车试验线交付使用

2022-12-06   中国产业经济信息网

卡拉OK到北京

2022-12-06   北京青年报官网

每日消息!SpringBoot基本应用

2022-12-05   腾讯云

Spring Boot + Shiro整合

2022-12-05   腾讯云

前沿资讯!SpringBoot基本使用

2022-12-05   腾讯云

神泣手游(神泣1 4)

2022-12-05   万能网

song ericsson x10铃声

2022-12-05   万能网

每日看点!仙剑5虚拟机镜像

2022-12-05   万能网

今晚再降!北京92号汽油重回“7元时代”

2022-12-05   北京日报客户端

首都博物馆:明日起暂停对外开放

2022-12-05   北京日报客户端

yui gloria

2022-12-05   万能网

近40年来青藏高原湖泊的结冰时间普遍推迟

2022-12-05   中国网·中国发展门户网

焦点观察:韩丹彤(丹彤)

2022-12-05   万能网

本土新增“4247+25477”

2022-12-05   人民网科普

Copyright   2015-2022 中国行业信息网版权所有  备案号:   联系邮箱:29 59 11 57 8@qq.com