合信论坛

快捷导航
查看: 172|回复: 0

ModbusFB库中ModbusTCPMaster功能使用教程

[复制链接]

165

主题

261

帖子

4459

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4459
发表于 2026-4-29 13:45:35 | 显示全部楼层 |阅读模式
1、在库管理器中添加ModbusFB库
主要使用下面的FB功能块实现对各个数据区域的读写操作

2、下例为通过状态机循环轮询访问方式实现对保持寄存器的读写以及线圈的读写的操作
2.1FB功能块实例化以及相关变量定义
VAR
    // TCP 驱动
    fbTCP : ModbusFB.ClientTCP;
    aIPAddress : ARRAY[0..3] OF BYTE := [192, 168, 1, 7];
    xConnect: BOOL := TRUE;
    xConnected : BOOL;
    // ================== 读保持寄存器
    fbReadHolding : ModbusFB.ClientRequestReadHoldingRegisters;
    arReadData : ARRAY[0..9] OF WORD;
    // ================== 写保持寄存器
    fbWriteHolding : ModbusFB.ClientRequestWriteMultipleRegisters;
    uiWriteValue : ARRAY[0..9] OF WORD ; // 要写入的值
    // ================== 读线圈(0x)
    fbReadCoil : ModbusFB.ClientRequestReadCoils;
    bCoilValue : BOOL; // 读到的线圈状态
    // ================== 写线圈
    fbWriteCoil : ModbusFB.ClientRequestWriteSingleCoil;
    bSetCoil : BOOL := TRUE; // 要写的线圈状态
    // 状态机 + 定时
    tReadTimer : TON;
    eState : (IDLE, READ_HOLD, WRITE_HOLD, READ_COIL, WRITE_COIL) := IDLE;
    xExecute : BOOL;
END_VAR
2.2程序实现
// TCP 驱动配置
fbTCP.aIPAddr[0] := aIPAddress[0];
fbTCP.aIPAddr[1] := aIPAddress[1];
fbTCP.aIPAddr[2] := aIPAddress[2];
fbTCP.aIPAddr[3] := aIPAddress[3];
fbTCP.uiPort := 502;
fbTCP.xConnect := xConnect;
fbTCP();
// 1. 读保持寄存器 40001
fbReadHolding(
    rClient := fbTCP,
    xExecute := xExecute AND (eState = READ_HOLD),
    uiUnitId := 1,
    uiStartItem := 0,
    uiQuantity := 10,
    pData := ADR(arReadData)
);
// 2. 写保持寄存器 40001
fbWriteHolding(
    rClient := fbTCP,
    xExecute := xExecute AND (eState = WRITE_HOLD),
    uiUnitId := 1,
    uiStartItem:=10 ,
uiQuantity:= 10,
pData:=ADR(uiWriteValue));
// 3. 读线圈 00001
fbReadCoil(
    rClient := fbTCP,
    xExecute := xExecute AND (eState = READ_COIL),
    uiUnitId := 1,
    uiStartItem := 0,
    uiQuantity := 1,
    pData := ADR(bCoilValue)
);
// 4. 写线圈 00001
fbWriteCoil(
    rClient := fbTCP,
    xExecute := xExecute AND (eState = WRITE_COIL),
    uiUnitId := 1,
    uiItem := 0,
    xValue := bSetCoil
);
// 轮询状态机(自动轮流读写)
IF fbTCP.xConnected THEN
        CASE eState OF
            IDLE:
                eState := READ_HOLD;
            READ_HOLD:
     IF fbReadHolding.xDone OR fbReadHolding.xError  THEN
                    eState := WRITE_HOLD;
                END_IF;
            WRITE_HOLD:
             IF fbWriteHolding.xDone OR fbWriteHolding.xError THEN
                    eState := READ_COIL;
                END_IF;
            READ_COIL:
                IF fbReadCoil.xDone OR fbReadCoil.xError THEN
                    eState := WRITE_COIL;
                END_IF;
            WRITE_COIL:
                IF fbWriteCoil.xDone OR fbWriteCoil.xError THEN
                    eState := READ_HOLD;
                END_IF;
        END_CASE;
        xExecute := TRUE;
    ELSE
        xExecute := FALSE;
  eState := IDLE;
    END_IF;



来源: ModbusFB库中ModbusTCPMaster功能使用教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2026-6-14 23:15 , Processed in 0.020089 second(s), 18 queries .

快速回复 返回顶部 返回列表