485转TCP-西门子1200数据读取-FB块封装

科技   2024-10-31 22:00   广东  

将RS-485通信转换为TCP/IP通信,通常是为了让不支持以太网通信的设备能够通过网络进行数据传输。在西门子S7-1200 PLC的情况下,如果你想要通过RS-485接口读取数据,并且希望通过TCP/IP协议来访问这些数据,你可以使用一个RS-485转TCP的转换器(也称为串口服务器或串行到以太网转换器)。

下面是实现这个过程的一般步骤:


  1. 选择合适的RS-485转TCP转换器:

  • 确保转换器支持RS-485标准。

  • 检查它是否兼容你的网络环境(如IP地址设置、端口配置等)。

  • 有些高级型号可能提供额外的功能,比如数据加密、断线重连机制等。


  • 硬件连接:

    • 将转换器的RS-485端口与PLC的RS-485端口相连。注意正确的接线方式(A-B线对应)。

    • 使用网线将转换器的以太网端口连接至你的局域网中。


  • 配置RS-485转TCP转换器:

    • 通常需要通过网页界面或者专用软件对转换器进行配置,包括设定IP地址、端口号以及RS-485参数(波特率、数据位、停止位、校验位等)。

    • 确保配置信息与PLC的通信设置相匹配。


  • 编程PLC:

    • 在TIA Portal或其他适用的编程环境中编写程序,使PLC能够通过其RS-485接口发送/接收数据。

    • 如果必要的话,还需编写处理来自TCP客户端的数据请求的逻辑。


  • 开发TCP客户端应用:

    • 开发一个可以作为TCP客户端的应用程序,该程序应该能够建立到RS-485转TCP转换器的TCP连接。

    • 客户端应用程序需要构造符合MODBUS RTU或其他你所使用的协议格式的请求帧,并通过TCP发送给转换器。

    • 接收并解析从转换器返回的数据。


  • 测试与调试:

    • 测试整个系统的连通性和稳定性。

    • 调试可能出现的问题,比如通信超时、数据错误等。


    一、485-TCP通讯模块

    485转TCP通讯模块是一种常见的设备,用于将RS-485串行通信转换为基于TCP/IP的网络通信。这类模块可以帮助用户通过以太网远程访问和控制使用RS-485接口的设备,如PLC、传感器等。下面是关于如何设置和使用这种类型模块的一般指导步骤:


    1. 硬件安装


    • 连接电源:确保给模块提供正确的电源电压。

    • 连接RS-485:按照模块上的指示正确连接A线(通常是负极)和B线(正极)。确保终端电阻的设置符合要求。

    • 连接以太网:使用标准网线将模块连接到局域网交换机或直接连接到电脑。


    2. 配置网络参数


    大多数485转TCP模块可以通过Web界面进行配置。通常需要做以下几步:

    • 获取IP地址:如果不知道模块的默认IP地址,可以查阅产品手册或联系供应商。有些模块支持自动DHCP获取IP地址。

    • 登录管理界面:在电脑浏览器中输入模块的IP地址进入配置页面。

    • 修改网络设置:根据实际网络环境调整IP地址、子网掩码、网关等信息。

    • 设定端口号:定义用于监听的数据传输端口。

    • 保存设置:完成配置后不要忘记保存更改,并重启设备使新设置生效。


    3. RS-485参数配置


    • 在配置界面中,设置与RS-485设备相匹配的波特率、数据位、停止位以及校验方式等通信参数。

    • 如果是MODBUS RTU协议,还需要注意从站ID等特定参数的设置。



    二、西门子1200MODBUS-TCP-FB块封装

    西门子S7-1200系列PLC支持使用TIA Portal软件进行编程,可以通过FB(功能块)来封装特定的功能,如MODBUS TCP通信。为了实现MODBUS TCP通信,你需要利用TIA Portal中的库或自己创建一个自定义的功能块。以下是一个基本的步骤指南,用于在S7-1200 PLC中封装和使用MODBUS TCP功能块:


    1. 准备工作

    • 确保你有最新版本的TIA Portal软件。

    • 安装并配置好以太网模块(如果需要的话)。

    • 确认你的S7-1200 PLC固件版本支持MODBUS TCP。


    2. 创建项目和程序


    • 在TIA Portal中创建一个新的项目,并添加S7-1200 CPU。

    • 创建一个新的程序块,例如一个组织块(OB1)或者函数块(FB)。


    3. 使用库或创建自定义FB


          使用现有库

    • TIA Portal可能包含了一些预定义的库,这些库提供了MODBUS TCP通信的功能块。检查是否有可用的库,如“SIMATIC S7-1200/1500 Modbus TCP Library”。

    • 如果存在这样的库,导入它并按照文档说明使用其中的FB。


          创建自定义FB

    如果你需要创建自己的功能块,可以参考以下步骤:

    • 定义数据结构:为MODBUS请求和响应定义适当的数据类型。

    • 编写逻辑:根据MODBUS TCP协议编写发送和接收数据的逻辑。这通常涉及到TCP连接的建立、数据帧的构造、发送命令以及解析响应等操作。

    • 错误处理:确保在功能块中包含适当的错误处理机制,以便在通信失败时能够妥善处理。


    4. 示例代码片段


    IF #stop  THEN
        
        #Relay[10] := TRUE;
        
    END_IF;


    #R_TRIG_Instance(CLK := #run,
                     Q => #Relay[1]);


    IF #Relay[1] THEN
        
        #IN[1].REQ := TRUE;
        #Relay[10] := FALSE;
    END_IF;


    IF #Relay[10] =  FALSE THEN
        
        REGION 第一路读


            
            
            #MB_CLIENT_Instance(REQ := #IN[1].REQ,
                                DISCONNECT := #IN[1].DESCON,
                                MB_MODE := #IN[1].MODE,
                                MB_DATA_ADDR := #IN[1].DATA_ADDR,
                                MB_DATA_LEN := #IN[1].DATA_LEN,
                                DONE => #OUT[1].Master_Done,
                                BUSY => #OUT[1].Master_Busy,
                                ERROR => #OUT[1].Master_Error,
                                STATUS => #OUT[1].Master_Error_ID,
                                MB_DATA_PTR := #read_data_out_1,
                                CONNECT := #tcp_connect[1]);
            
            #IEC_Timer_0_Instance(IN := NOT #OUT[1].Master_Done,
                                  PT := T#1000MS);
            
            IF (#OUT[1].Master_Done OR #OUT[1].Master_Error) OR #IEC_Timer_0_Instance.Q THEN
                
                #IN[1].REQ := FALSE;
                #IN[2].REQ := TRUE;
            END_IF;
            
            IF #IEC_Timer_0_Instance.Q AND #OUT[1].Master_Busy THEN
                #Error_ID := 1;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
                #Relay[2] := TRUE;   // 报错中继
            END_IF;
            
            IF #IEC_Timer_0_Instance.Q = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
                
            END_IF;
            
        END_REGION
        
        REGION 第二路读
            
            #MB_CLIENT_Instance_1(REQ := #IN[2].REQ,
                                  DISCONNECT := #IN[2].DESCON,
                                  MB_MODE := #IN[2].MODE,
                                  MB_DATA_ADDR := #IN[2].DATA_ADDR,
                                  MB_DATA_LEN := #IN[2].DATA_LEN,
                                  DONE => #OUT[2].Master_Done,
                                  BUSY => #OUT[2].Master_Busy,
                                  ERROR => #OUT[2].Master_Error,
                                  STATUS => #OUT[2].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_2,
                                  CONNECT := #tcp_connect[2]);
            
            #IEC_Timer_0_Instance_1(IN := NOT #OUT[2].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[2].Master_Done OR #OUT[2].Master_Error) OR #IEC_Timer_0_Instance_1.Q OR #OUT[1].Master_Busy THEN
                
                #IN[2].REQ := FALSE;
                #IN[3].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_1.Q AND #OUT[2].Master_Busy THEN
                #Error_ID := 2;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_1.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
        END_REGION
        
        REGION 第三路读
            
            #MB_CLIENT_Instance_2(REQ := #IN[3].REQ,
                                  DISCONNECT := #IN[3].DESCON,
                                  MB_MODE := #IN[3].MODE,
                                  MB_DATA_ADDR := #IN[3].DATA_ADDR,
                                  MB_DATA_LEN := #IN[3].DATA_LEN,
                                  DONE => #OUT[3].Master_Done,
                                  BUSY => #OUT[3].Master_Busy,
                                  ERROR => #OUT[3].Master_Error,
                                  STATUS => #OUT[3].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_3,
                                  CONNECT := #tcp_connect[3]);
            
            
            #IEC_Timer_0_Instance_2(IN := NOT #OUT[3].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[3].Master_Done OR #OUT[3].Master_Error) OR #IEC_Timer_0_Instance_2.Q OR #OUT[2].Master_Busy THEN
                
                #IN[3].REQ := FALSE;
                #IN[4].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_2.Q AND #OUT[3].Master_Busy THEN
                #Error_ID := 3;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_2.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
            
            
        END_REGION
        
        REGION 第四路读
            
            #MB_CLIENT_Instance_3(REQ := #IN[4].REQ,
                                  DISCONNECT := #IN[4].DESCON,
                                  MB_MODE := #IN[4].MODE,
                                  MB_DATA_ADDR := #IN[4].DATA_ADDR,
                                  MB_DATA_LEN := #IN[4].DATA_LEN,
                                  DONE => #OUT[4].Master_Done,
                                  BUSY => #OUT[4].Master_Busy,
                                  ERROR => #OUT[4].Master_Error,
                                  STATUS => #OUT[4].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_4,
                                  CONNECT := #tcp_connect[4]);
            
            
            #IEC_Timer_0_Instance_3(IN := NOT #OUT[4].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[4].Master_Done OR #OUT[4].Master_Error) OR #IEC_Timer_0_Instance_3.Q OR #OUT[3].Master_Busy THEN
                
                #IN[4].REQ := FALSE;
                #IN[5].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_3.Q AND #OUT[4].Master_Busy THEN
                #Error_ID := 4;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_3.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
        END_REGION
        
        REGION 第五路读
            
            #MB_CLIENT_Instance_4(REQ := #IN[5].REQ,
                                  DISCONNECT := #IN[5].DESCON,
                                  MB_MODE := #IN[5].MODE,
                                  MB_DATA_ADDR := #IN[5].DATA_ADDR,
                                  MB_DATA_LEN := #IN[5].DATA_LEN,
                                  DONE => #OUT[5].Master_Done,
                                  BUSY => #OUT[5].Master_Busy,
                                  ERROR => #OUT[5].Master_Error,
                                  STATUS => #OUT[5].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_5,
                                  CONNECT := #tcp_connect[5]);
            
            
            
            #IEC_Timer_0_Instance_4(IN := NOT #OUT[5].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[5].Master_Done OR #OUT[5].Master_Error) OR #IEC_Timer_0_Instance_4.Q OR #OUT[4].Master_Busy THEN
                
                #IN[5].REQ := FALSE;
                #IN[6].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_4.Q AND #OUT[5].Master_Busy THEN
                #Error_ID := 5;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_4.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
        END_REGION
        
        REGION 第六路读
            
            #MB_CLIENT_Instance_5(REQ := #IN[6].REQ,
                                  DISCONNECT := #IN[6].DESCON,
                                  MB_MODE := #IN[6].MODE,
                                  MB_DATA_ADDR := #IN[6].DATA_ADDR,
                                  MB_DATA_LEN := #IN[6].DATA_LEN,
                                  DONE => #OUT[6].Master_Done,
                                  BUSY => #OUT[6].Master_Busy,
                                  ERROR => #OUT[6].Master_Error,
                                  STATUS => #OUT[6].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_6,
                                  CONNECT := #tcp_connect[6]);
            
            
            
            #IEC_Timer_0_Instance_5(IN := NOT #OUT[6].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[6].Master_Done OR #OUT[6].Master_Error) OR #IEC_Timer_0_Instance_5.Q OR #OUT[5].Master_Busy THEN
                
                #IN[6].REQ := FALSE;
                #IN[7].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_5.Q AND #OUT[6].Master_Busy THEN
                #Error_ID := 5;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_5.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
        END_REGION
        
        REGION 第七路读
            
            #MB_CLIENT_Instance_6(REQ := #IN[7].REQ,
                                  DISCONNECT := #IN[7].DESCON,
                                  MB_MODE := #IN[7].MODE,
                                  MB_DATA_ADDR := #IN[7].DATA_ADDR,
                                  MB_DATA_LEN := #IN[7].DATA_LEN,
                                  DONE => #OUT[7].Master_Done,
                                  BUSY => #OUT[7].Master_Busy,
                                  ERROR => #OUT[7].Master_Error,
                                  STATUS => #OUT[7].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_7,
                                  CONNECT := #tcp_connect[7]);
            
            
            
            #IEC_Timer_0_Instance_6(IN := NOT #OUT[7].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[7].Master_Done OR #OUT[7].Master_Error) OR #IEC_Timer_0_Instance_5.Q OR #OUT[6].Master_Busy THEN
                
                #IN[7].REQ := FALSE;
                #IN[8].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_6.Q AND #OUT[7].Master_Busy THEN
                #Error_ID := 7;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_6.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
        END_REGION
        
        REGION 第八路读
            
            #MB_CLIENT_Instance_7(REQ := #IN[8].REQ,
                                  DISCONNECT := #IN[8].DESCON,
                                  MB_MODE := #IN[8].MODE,
                                  MB_DATA_ADDR := #IN[8].DATA_ADDR,
                                  MB_DATA_LEN := #IN[8].DATA_LEN,
                                  DONE => #OUT[8].Master_Done,
                                  BUSY => #OUT[8].Master_Busy,
                                  ERROR => #OUT[8].Master_Error,
                                  STATUS => #OUT[8].Master_Error_ID,
                                  MB_DATA_PTR := #read_data_out_8,
                                  CONNECT := #tcp_connect[8]);
            
            
            #IEC_Timer_0_Instance_7(IN := NOT #OUT[8].Master_Done,
                                    PT := T#1000MS);
            
            IF (#OUT[8].Master_Done OR #OUT[8].Master_Error) OR #IEC_Timer_0_Instance_5.Q OR #OUT[7].Master_Busy THEN
                
                #IN[8].REQ := FALSE;
                #IN[1].REQ := TRUE;
                
            END_IF;
            
            IF #IEC_Timer_0_Instance_7.Q AND #OUT[8].Master_Busy THEN
                #Error_ID := 7;
                #Error_content := 'Disconnected_from_the_station';
                #ERROR := TRUE;
            END_IF;
            IF #IEC_Timer_0_Instance_6.Q = FALSE AND #Relay[2] = FALSE THEN
                #Error_content := 'No_error_reported';
                #Error_ID := 0;
                #ERROR := #Relay[2] := FALSE;
            END_IF;
            
        END_REGION
        


        
    END_IF;



    往期 · 推荐

    PLC早已不是那个PLC

    一种新型扳手,颠覆了100多年的设计

    100张车间改善案例图,爆炸输出

    见到一个神秘的元件,十个电工九个挠头,只有个新手电工坚持在摸索!

    【通俗易懂】看看如何用漫画解释电压并列和切换的原理~

    分享、在看与点赞,至少我要拥有一个吧!

    工控论坛
    工控论坛,自动化从业者的精神家园
     最新文章