(相关资料图)
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 关闭