前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >S7-1500PLC TCP_FB_V1.2

S7-1500PLC TCP_FB_V1.2

原创
作者头像
没事闲的
修改2025-03-17 09:30:38
修改2025-03-17 09:30:38
810
举报
文章被收录于专栏:TCP communicationTCP communication

TCP communication test function block, version V1.2, support data sending and receiving, heartbeat timing transmission, display receiving, and Time-limited reception, can be downloaded and tested.(Only for personal test use, do not use in the field production environment, if you have questions please contact the author)

支持常规数据收发,心跳定时发送,限时接收,以及数据接收验证;仅供个人测试;

程序中如有问题感谢反馈,我会及时做出修改!

一、功能块引脚

TCP_FB
TCP_FB

功能块引脚包括:initialize初始化、TCP_Parameter,两个引脚;

二、內部程序(部分)

内部变量
内部变量

1、程序段1:Initialize初始化

程序段1:Initialize
程序段1:Initialize

2、Parameter mapping

代码语言:txt
复制
//Control

#S_TSEND_C_Instance.CONT := #TCP_Parameter.DATA.Control.CONT; //连接赋值

//Data
IF #"S_Ephemeral data".HeartSend_State
THEN
    //#TCP_Parameter.DATA.S_HeartBeat.RECEIVE := #S_HeartBeat.RECEIVE;
    #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_LEN := #S_HeartBeat.RECEIVE.Recv_LEN;
    #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_Count := #S_HeartBeat.RECEIVE.Recv_Count;
    #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_Valid := #S_HeartBeat.RECEIVE.Recv_Valid;
    #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_Check_Err := #S_HeartBeat.RECEIVE.Recv_Check_Err;
    #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_ASCII := #S_HeartBeat.RECEIVE.Recv_ASCII;
    
    #S_HeartBeat.RECEIVE.Recv_Check_Enable := "TCP_Parameter".Data.DATA.S_HeartBeat.RECEIVE.Recv_Check_Enable;
    
    
    UMOVE_BLK(IN := #S_Data.RECEIVE.Recv[0],
              COUNT := 32,
              OUT => #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv[0]);
    UMOVE_BLK(IN := #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_CheckData[0],
              COUNT := 32,
              OUT => #S_HeartBeat.RECEIVE.Recv_CheckData[0]);
    
    #S_HeartBeat.RECEIVE.Recv_Check_Enable := #TCP_Parameter.DATA.S_HeartBeat.RECEIVE.Recv_Check_Enable;
    
    
    #S_TSEND_C_Instance.LEN := #TCP_Parameter.DATA.S_HeartBeat.SEND.Send_Len;
    
    #TCP_Parameter.DATA.S_HeartBeat.SEND.Send_Count := #S_HeartBeat.SEND.Send_Count;
    #TCP_Parameter.DATA.S_HeartBeat.SEND.Send_Valid := #S_Data.SEND.Send_Valid;
    #TCP_Parameter.DATA.S_HeartBeat.SEND.Send_ASCII := #S_Data.SEND.Send_ASCII;
    UMOVE_BLK(IN := #TCP_Parameter.DATA.S_HeartBeat.SEND.Send[0],
              COUNT := 32,
              OUT => #S_Data.SEND.Send[0]);
   
END_IF;
    
IF #"S_Ephemeral data".HeartSend_State = FALSE 
THEN
    #TCP_Parameter.DATA.Data.RECEIVE := #S_Data.RECEIVE;
    
    #S_TSEND_C_Instance.LEN := #TCP_Parameter.DATA.Data.SEND.Send_Len;
    #TCP_Parameter.DATA.Data.SEND.Send_Count := #S_Data.SEND.Send_Count;
    #TCP_Parameter.DATA.Data.SEND.Send_Valid := #S_Data.SEND.Send_Valid;
    #TCP_Parameter.DATA.Data.SEND.Send_ASCII := #S_Data.SEND.Send_ASCII;
    #S_Data.SEND.Send := #TCP_Parameter.DATA.Data.SEND.Send;
    
    #S_TSEND_C_Instance.REQ := #TCP_Parameter.DATA.Control.Send_REQ;
    #S_TRCV_Instance.EN_R := #TCP_Parameter.DATA.Control.Recv_REQ;
    
    
END_IF;

//Communication
#S_TCP_Comm.Tcon_Connect.InterfaceId := #TCP_Parameter.DATA.TCP_Communication.parameter.InterfaceId;
#S_TCP_Comm.Tcon_Connect.ID := #TCP_Parameter.DATA.TCP_Communication.parameter.Connect_ID;
#S_TCP_Comm.Tcon_Connect.ActiveEstablished := #TCP_Parameter.DATA.TCP_Communication.parameter.ActiveEstablished;
#S_TCP_Comm.Tcon_Connect.RemotePort := #TCP_Parameter.DATA.TCP_Communication.parameter.RemotePort;
#S_TCP_Comm.Tcon_Connect.LocalPort:= #TCP_Parameter.DATA.TCP_Communication.parameter.LocalPort;

//Addr
#S_ADDR_SPLIT.Addr_ALL := #TCP_Parameter.DATA.TCP_Communication.parameter.RemoteAddress;

//Status
#TCP_Parameter.DATA.TCP_Communication.Status.Tsend_DONE := #S_TSEND_C_Instance.DONE;
#TCP_Parameter.DATA.TCP_Communication.Status.Tsend_BUSY := #S_TSEND_C_Instance.BUSY;
#TCP_Parameter.DATA.TCP_Communication.Status.Tsend_ERROR := #S_TSEND_C_Instance.ERROR;
#TCP_Parameter.DATA.TCP_Communication.Status.Tsend_STATUS := #S_TSEND_C_Instance.STATUS;
#TCP_Parameter.DATA.TCP_Communication.Status.Trcv_NDR := #S_TRCV_Instance.NDR;
#TCP_Parameter.DATA.TCP_Communication.Status.Trcv_BUSY := #S_TRCV_Instance.BUSY;
#TCP_Parameter.DATA.TCP_Communication.Status.Trcv_ERROR := #S_TRCV_Instance.ERROR;
#TCP_Parameter.DATA.TCP_Communication.Status.Trcv_STATUS := #S_TRCV_Instance.STATUS;

//HeartBeat

#S_HeartBeat.HeartBeat_Enable := #TCP_Parameter.DATA.S_HeartBeat.HeartBeat_Enable;
#S_HeartBeat.Send_interval := #TCP_Parameter.DATA.S_HeartBeat.Send_Interval;

3、地址拆分

代码语言:txt
复制
IF #S_TSEND_C_Instance.CONT = FALSE
THEN
    
    #S_ADDR_SPLIT.Addr_S := #S_ADDR_SPLIT.Addr_ALL;
    #S_ADDR_SPLIT.Addr_S := CONCAT(IN1 := #S_ADDR_SPLIT.Addr_S, IN2 := '.');
    FOR #S_ADDR_SPLIT.Addr_C := 0 TO 3 DO
        // Statement section FOR
        // 
        #S_ADDR_SPLIT.Len[#S_ADDR_SPLIT.Addr_C] := (FIND(IN1 := #S_ADDR_SPLIT.Addr_S, IN2 := '.')) - 1;
        
        #S_ADDR_SPLIT.ADDR_String[#S_ADDR_SPLIT.Addr_C] := LEFT(IN := #S_ADDR_SPLIT.Addr_S, L := #S_ADDR_SPLIT.Len[#S_ADDR_SPLIT.Addr_C]);
        #S_ADDR_SPLIT.ADDR_Int[#S_ADDR_SPLIT.Addr_C] := STRING_TO_INT(#S_ADDR_SPLIT.ADDR_String[#S_ADDR_SPLIT.Addr_C]);
        #S_ADDR_SPLIT.Addr_S := DELETE(IN := #S_ADDR_SPLIT.Addr_S, L := (#S_ADDR_SPLIT.Len[#S_ADDR_SPLIT.Addr_C] + 1), P := 1);
        #S_ADDR_SPLIT.ADDR_Byte[#S_ADDR_SPLIT.Addr_C] := INT_TO_BYTE(#S_ADDR_SPLIT.ADDR_Int[#S_ADDR_SPLIT.Addr_C]);
        
    END_FOR;
    
    IF #S_ADDR_SPLIT.ADDR_Int[0] > 0 AND
        #S_ADDR_SPLIT.ADDR_Int[1] > 0 AND
        #S_ADDR_SPLIT.ADDR_Int[2] >= 0 AND
        #S_ADDR_SPLIT.ADDR_Int[3] > 0 AND
        #S_ADDR_SPLIT.ADDR_Int[0] < 255 AND
        #S_ADDR_SPLIT.ADDR_Int[1] < 255 AND
        #S_ADDR_SPLIT.ADDR_Int[2] < 255 AND
        #S_ADDR_SPLIT.ADDR_Int[3] < 255
    THEN
        #S_ADDR_SPLIT."Address valid" := TRUE;
    ELSE
        #S_ADDR_SPLIT."Address valid" := FALSE;
    END_IF;
    
    IF #S_ADDR_SPLIT."Address valid"
    THEN
        #S_TCP_Comm.Tcon_Connect.RemoteAddress.ADDR := #S_ADDR_SPLIT.ADDR_Byte;
    END_IF;

END_IF;

4、communication

通信建立
通信建立

5、正常收发信号处理

6、心跳信号处理+发送有效状态

7、心跳信号接收

8、

9、超限判断

代码语言:txt
复制
IF #"S_Ephemeral data".HeartSend_State AND

    #S_Time.TON[1].ET = #TCP_Parameter.DATA.S_HeartBeat.Send_Time_Limit AND
    #"S_Ephemeral data".Resend_Cycle=FALSE
THEN
    #TCP_Parameter.DATA.S_HeartBeat.Status.HeartBeat_Err := true;
END_IF;

IF  #TCP_Parameter.DATA.S_HeartBeat.HeartBeat_Enable = FALSE OR
    #TCP_Parameter.DATA.S_HeartBeat.Reset
THEN
    #TCP_Parameter.DATA.S_HeartBeat.Status.HeartBeat_Err := FALSE;
    #TCP_Parameter.DATA.S_HeartBeat.Status.Resend_count := 0;

END_IF;
    

此功能块在特定设备上测试OK。如需源码下载 请关注WX公众号:CCLib

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TCP communication test function block, version V1.2, support data sending and receiving, heartbeat timing transmission, display receiving, and Time-limited reception, can be downloaded and tested.(Only for personal test use, do not use in the field production environment, if you have questions please contact the author)
  • 支持常规数据收发,心跳定时发送,限时接收,以及数据接收验证;仅供个人测试;
  • 一、功能块引脚
  • 二、內部程序(部分)
    • 1、程序段1:Initialize初始化
    • 2、Parameter mapping
    • 3、地址拆分
  • 此功能块在特定设备上测试OK。如需源码下载 请关注WX公众号:CCLib
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档