概述
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/01Ethernet/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
SEND_C、TRCV_C指令块Connect脚指向连接描述结构的指针,可以使用以下结构(系统数据类型):
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#7005
OR #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通信调用。
希望可以帮助到你。
感谢看到这里,谢谢
最后
以上就是懵懂汽车为你收集整理的西门子SCL---Tcp/ip通信的全部内容,希望文章能够帮你解决西门子SCL---Tcp/ip通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复