一、硬件准备
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. 记录通信错误代码以便排查问题
以上程序框架可根据实际梅特勒仪表型号和具体需求进行调整。