西门子S7-1200 Modbus RTU读取梅特勒称重仪表的程序及步骤

一、硬件准备
1. S7-1200 PLC (如1214C DC/DC/DC)
2. CM 1241 RS485通信模块
3. 10台梅特勒称重仪表(如IND331/IND560等,需支持Modbus RTU)
4. RS485总线(建议使用屏蔽双绞线)
5. 终端电阻(120Ω,总线两端各一个)
接线说明
• 将CM1241的A端子接所有仪表的A端子
• 将CM1241的B端子接所有仪表的B端子
• 总线两端接120Ω终端电阻
• 确保所有仪表地址唯一(通常为1-10)
二、软件配置步骤
1. 组态硬件
1.1在TIA Portal中创建新项目
1.2添加S7-1200 CPU和CM1241 RS485模块
1.3.配置CM1241:
接口类型: RS485
协议: Modbus
波特率: 9600(与仪表一致)
数据位: 8
奇偶校验: 无(与仪表一致)
停止位: 1
2. 创建Modbus通信程序
定义数据块
创建全局数据块(如"DB_WeightScales")存储读取的数据:

STRUCT
    Scale1_Weight : REAL
    Scale1_Status : WORD
    Scale2_Weight : REAL
    Scale2_Status : WORD
    // ...其他8个仪表数据
    Scale10_Weight : REAL
    Scale10_Status : WORD
END_STRUCT
主程序(OB1)

// 网络1: 初始化Modbus主站
"MB_MASTER_DB"(REQ := "FirstScan",
               MB_MODE := 0,
               MB_ADDR := 0,
               MB_BAUD := 9600,
               MB_PARITY := 0,
               MB_DB := "Modbus_DB",
               DONE => "Modbus_Init_Done",
               ERROR => "Modbus_Init_Error",
               STATUS => "Modbus_Init_Status");

// 网络2: 读取仪表1数据
IF "Modbus_Init_Done" AND NOT "Reading_In_Progress" THEN
    "Reading_In_Progress" := TRUE;
    "Current_Scale" := 1;
    "MB_MASTER_DB"(REQ := TRUE,
                  MB_MODE := 1,
                  MB_ADDR := 1, // 仪表地址1
                  MB_REG_ADDR := 40001, // 梅特勒重量寄存器通常为40001
                  MB_LEN := 2, // 读取2个字(REAL类型)
                  MB_DATA_PTR := "DB_WeightScales".Scale1_Weight,
                  DONE => "Read_Done",
                  ERROR => "Read_Error",
                  STATUS => "Read_Status");
END_IF;

// 网络3: 读取完成处理
IF "Read_Done" OR "Read_Error" THEN
    "Reading_In_Progress" := FALSE;
    // 可以在这里添加错误处理逻辑
    
    // 延时后读取下一个仪表
    "Read_Timer"(IN := TRUE, PT := T#200MS);
    IF "Read_Timer".Q THEN
        "Read_Timer"(IN := FALSE);
        "Current_Scale" := "Current_Scale" + 1;
        IF "Current_Scale" <= 10 THEN
            // 触发读取下一个仪表
        END_IF;
    END_IF;
END_IF;

// 网络4-12: 类似地添加其他9个仪表的读取逻辑
3. 轮询读取所有仪表
由于Modbus RTU是半双工通信,需要依次读取每个仪表。可以使用状态机或顺序控制逻辑来实现。
优化方案(使用FB)
创建功能块FB"ScaleReader":

VAR_INPUT
    Start : BOOL;
    Scale_Address : INT;
END_VAR

VAR_OUTPUT
    Weight : REAL;
    Status : WORD;
    Done : BOOL;
    Error : BOOL;
END_VAR

VAR
    Read_Request : BOOL;
    Read_Done : BOOL;
    Read_Error : BOOL;
    Read_Status : WORD;
END_VAR

// 读取逻辑
IF Start THEN
    "MB_MASTER_DB"(REQ := TRUE,
                  MB_MODE := 1,
                  MB_ADDR := Scale_Address,
                  MB_REG_ADDR := 40001,
                  MB_LEN := 2,
                  MB_DATA_PTR := Weight,
                  DONE => Read_Done,
                  ERROR => Read_Error,
                  STATUS => Read_Status);
END_IF;

Done := Read_Done;
Error := Read_Error;
在OB1中调用FB

// 初始化10个FB实例
"ScaleReader1"(Start := "Read_Cycle" AND NOT "Reading_In_Progress",
              Scale_Address := 1,
              Weight => "DB_WeightScales".Scale1_Weight,
              Status => "DB_WeightScales".Scale1_Status,
              Done => "Scale1_Done",
              Error => "Scale1_Error");

"ScaleReader2"(Start := "Scale1_Done",
              Scale_Address := 2,
              // ...其他参数
              );

// ...其他8个实例

// 读取周期控制
"Read_Timer"(IN := TRUE, PT := T#5S);
IF "Read_Timer".Q THEN
    "Read_Timer"(IN := FALSE);
    "Read_Cycle" := TRUE;
END_IF;

IF "Scale10_Done" THEN
    "Read_Cycle" := FALSE;
END_IF;
注意事项
1. 确保所有仪表的Modbus地址唯一(1-10)
2. 确认梅特勒仪表的具体Modbus寄存器地址(不同型号可能不同)
3. 根据实际需求调整读取周期(通常5-10秒足够)
4. 添加适当的错误处理和重试机制
5. 长距离通信时(>50米)需考虑信号质量,必要时增加中继器
6. 在调试阶段使用Modbus调试工具(如ModScan)验证仪表响应
调试技巧
1. 先单独测试一个仪表的通信
2. 使用交叉参考表监控通信状态字
3. 检查CM1241模块的LED指示灯状态
4. 使用TIA Portal的在线诊断功能
5. 记录通信错误代码以便排查问题
以上程序框架可根据实际梅特勒仪表型号和具体需求进行调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇钶宇夕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值