西门子博图ModbusRTU轮询FB

1、添加RS485硬件(CM1241)
1
2、RS485硬件设置
2
3、添加自定义数据类型
3
4、添加FB功能块(及功能块输入输出接口)
4
5、功能块SCL代码
5
//==代码=

点击查看代码
//PLC首次扫描时设置通讯模式
IF "FirstScan" THEN
    #Modbus_Comm_Load_Instance.MODE := 4;
END_IF;

//复位错误
IF #Reset THEN
    FOR #i := 0 TO 5 BY 1 DO
        #Request[#i].Status := 16#0000;
    END_FOR;
END_IF;


//初始化端口
#Modbus_Comm_Load_Instance(REQ:="FirstScan" OR #Reset,
                           "PORT":=#Port,
                           BAUD:=#Baud,
                           PARITY:=#Parity,
                           FLOW_CTRL:=0,
                           RTS_ON_DLY:=0,
                           RTS_OFF_DLY:=0,
                           RESP_TO:=1000,
                           MB_DB:=#Modbus_Master_Instance.MB_DB);
//初始化完成
IF #Modbus_Comm_Load_Instance.DONE THEN
    #Init_OK := TRUE;
END_IF;
//初始化失败     
IF #Modbus_Comm_Load_Instance.ERROR THEN
    #Retval := #Modbus_Comm_Load_Instance.STATUS;
    RETURN; //退出功能块
END_IF;
//调用主站
#Modbus_Master_Instance(REQ:=#Req,
                        MB_ADDR:=#Work.SlaveNO,
                        MODE:=#Work.Mode,
                        DATA_ADDR:=#Work."Data Address",
                        DATA_LEN:=#Work."Data Length",
                        DATA_PTR:=#Work.Result);

CASE #STEP OF
    00://RUN需要保持
        IF #Run AND NOT #Reset AND #Init_OK THEN
            #STEP := 10;
        END_IF;
    10://限定循环范围,保持在数组的索引内
        IF #Index < #Slave_1ST OR #Index > #Slave_Last THEN
            #Index := #Slave_1ST;
            #STEP := 20;
        END_IF;
    20://判断从站是否有错误,有则跳过
        IF #Request[#Index].Status = 0 THEN
            #STEP := 30;
        ELSE
            #STEP := 50;
        END_IF;
    30://启动主站的读写请求
        #Work := #Request[#Index];
        #Req := TRUE;
        #STEP := 40;
    40://接收从站的信息
        IF #Modbus_Master_Instance.DONE OR #Modbus_Master_Instance.ERROR THEN
            #Request[#Index].Result := #Work.Result;//保存读取到的信息
            #Request[#Index].Status := #Work.Status;//保存从站的状态
            #STEP := 50;
            #Req := FALSE;
        END_IF;
    50:
        #Index := #Index + 1;
        #STEP := 00;
END_CASE;
posted @ 2026-06-16 19:24  Ian_Xue  阅读(7)  评论(0)    收藏  举报