在工业自动化控制系统中,PLC与变频器的协同工作一直是工程师们关注的重点。西门子S7-1200 PLC与G120变频器的组合因其稳定性和灵活性,在各类自动化项目中得到广泛应用。本文将详细介绍如何通过Modbus RTU协议实现PLC与多台G120变频器的稳定通讯,并构建一个具备手动/自动切换功能的PID控制FB块。
这个方案的核心价值在于:
RS485总线是Modbus RTU通讯的物理基础,正确的接线是通讯成功的前提。对于S7-1200 PLC,我们需要使用CM 1241 RS485通讯模块(6ES7241-1CH32-0XB0)。接线时需注意:
注意:G120变频器的RS485接口位于CU250S-2控制单元上,标识为P+(A+)和N-(B-)。实际接线前务必确认变频器型号和接口位置。
为确保通讯稳定,所有设备必须采用相同的通讯参数:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| 波特率 | 9600 bps | 工业现场常用值,平衡速度与抗干扰 |
| 数据位 | 8 bit | Modbus标准配置 |
| 停止位 | 1 bit | |
| 校验方式 | 偶校验 | 增强数据可靠性 |
| 响应超时 | 1000 ms | 根据网络规模可调整 |
设备添加:
通讯模块参数设置:
xml复制<Module name="CM1241" slot="1">
<Parameter name="BaudRate" value="9600"/>
<Parameter name="Parity" value="Even"/>
<Parameter name="StopBits" value="1"/>
</Module>
变频器设备配置:
pascal复制// 定义通讯参数结构体
TYPE MB_PARAM :
STRUCT
PORT : INT := 2; // 通讯端口
BAUD : INT := 9600;
PARITY : INT := 2; // 0-无校验 1-奇校验 2-偶校验
RTS_DELAY : INT := 0;
END_STRUCT
END_TYPE
// 初始化Modbus主站
MB_COMM_LOAD(
COMM_PORT := MB_CONFIG.PORT,
BAUD := MB_CONFIG.BAUD,
PARITY := MB_CONFIG.PARITY,
RTS_ON_DLY := MB_CONFIG.RTS_DELAY,
RTS_OFF_DLY := MB_CONFIG.RTS_DELAY,
MAX_MSG_LEN := 256,
ERROR => MB_ERROR,
STATUS => MB_STATUS
);
pascal复制// 读取变频器频率(40001)
MB_MASTER(
REQ := NOT MB_BUSY,
MB_ADDR := 1, // 变频器地址
ID := 1,
FUNC := 3, // 功能码03
DB_NO := 10, // 数据块编号
START := 40001, // 起始地址
NUM := 1, // 读取数量
ERROR => MB_ERROR,
STATUS => MB_STATUS
);
// 写入目标频率(40002)
MB_MASTER(
REQ := NOT MB_BUSY,
MB_ADDR := 1,
ID := 2,
FUNC := 6, // 功能码06
DB_NO := 20,
START := 40002,
NUM := 1,
ERROR => MB_ERROR,
STATUS => MB_STATUS
);
实操技巧:建议为每个变频器创建单独的数据块(DB),便于管理和维护。例如DB10用于地址1的变频器,DB11用于地址2的变频器。
pascal复制FUNCTION_BLOCK "PID_CTRL"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
AUTHOR : [YourName]
VAR_INPUT
// 过程变量
Setpoint : Real; // 设定值
ProcessValue : Real; // 反馈值
// 模式控制
ManualAutoSwitch : Bool; // TRUE=手动 FALSE=自动
ManualValue : Real; // 手动输出值(0.0-100.0)
// PID参数
Kp : Real := 1.0; // 比例系数
Ti : Real := 10.0; // 积分时间(s)
Td : Real := 0.1; // 微分时间(s)
// 限制参数
OutMax : Real := 100.0; // 输出上限
OutMin : Real := 0.0; // 输出下限
END_VAR
VAR_OUTPUT
Output : Real; // 控制输出
Error : Real; // 当前偏差
END_VAR
VAR
// 内部变量
LastError : Real;
Integral : Real;
LastTime : Time;
END_VAR
pascal复制// 计算偏差
Error := Setpoint - ProcessValue;
// 手动模式处理
IF ManualAutoSwitch THEN
Output := LIMIT(ManualValue, OutMin, OutMax);
Integral := 0.0; // 复位积分项
ELSE
// 自动模式 - PID计算
VAR_TEMP
DeltaT : Real;
P_Term : Real;
I_Term : Real;
D_Term : Real;
END_VAR
// 计算时间间隔(秒)
DeltaT := REAL_TO_TIME(T#1S) / 1000.0;
// 比例项
P_Term := Kp * Error;
// 积分项(抗饱和处理)
IF (Output < OutMax) AND (Output > OutMin) THEN
Integral := Integral + (Kp/Ti) * Error * DeltaT;
END_IF;
// 微分项
D_Term := Kp * Td * (Error - LastError) / DeltaT;
// 综合输出
Output := P_Term + Integral + D_Term;
Output := LIMIT(Output, OutMin, OutMax);
// 更新历史值
LastError := Error;
END_IF;
在实际应用中,积分饱和是PID控制的常见问题。我们通过以下改进增强鲁棒性:
pascal复制// 在自动模式计算中加入积分限制
IF (Output >= OutMax) AND (Error > 0) THEN
Integral := Integral; // 停止积分增长
ELSIF (Output <= OutMin) AND (Error < 0) THEN
Integral := Integral; // 停止积分减少
ELSE
Integral := Integral + (Kp/Ti) * Error * DeltaT;
END_IF;
主监控画面:
参数设置画面:
操作面板:
xml复制<Button Name="Btn_Mode" Text="自动模式">
<Event Name="Click">
<Script>
// 切换手动/自动状态
SetTag("PID_ManualAuto", NOT GetTag("PID_ManualAuto"));
// 更新按钮文本
if GetTag("PID_ManualAuto") then
Btn_Mode.Text = "手动模式";
else
Btn_Mode.Text = "自动模式";
end
</Script>
</Event>
</Button>
xml复制<TrendView Name="Trend_PID">
<Axes>
<Axis Name="Primary" Min="0" Max="100"/>
</Axes>
<Series>
<Series Name="Setpoint" Color="Green" Axis="Primary"/>
<Series Name="ProcessValue" Color="Red" Axis="Primary"/>
<Series Name="Output" Color="Blue" Axis="Primary"/>
</Series>
</TrendView>
常见通讯问题及解决方法:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯超时 | 波特率不匹配 | 检查所有设备波特率设置 |
| CRC错误 | 线路干扰 | 检查屏蔽层接地,缩短通讯距离 |
| 无响应 | 地址错误 | 确认变频器Modbus地址设置 |
| 数据错误 | 寄存器映射不对 | 核对G120 Modbus寄存器表 |
采用经典的Ziegler-Nichols方法进行参数整定:
| 控制类型 | Kp | Ti | Td |
|---|---|---|---|
| P | 0.5Ku | - | - |
| PI | 0.45Ku | Tu/1.2 | - |
| PID | 0.6Ku | Tu/2 | Tu/8 |
现场经验:对于变频器控制,建议先使用PI控制,待系统稳定后再考虑加入微分作用。微分项对噪声敏感,可能引起执行机构频繁动作。
通过Modbus广播功能实现多台变频器同步:
pascal复制// 广播写入频率
MB_MASTER(
REQ := NOT MB_BUSY,
MB_ADDR := 0, // 广播地址
FUNC := 6,
DB_NO := 30,
START := 40002,
NUM := 1,
ERROR => MB_ERROR,
STATUS => MB_STATUS
);
为提高系统可靠性,可考虑以下方案:
pascal复制// 心跳检测实现
IF NOT HeartbeatTimer.Q THEN
HeartbeatTimer(IN := TRUE, PT := T#5S);
HeartbeatCounter := HeartbeatCounter + 1;
// 超过3次未响应切换备用通道
IF HeartbeatCounter > 3 THEN
ActivePort := NOT ActivePort;
HeartbeatCounter := 0;
END_IF;
END_IF;
通过Modbus实现参数批量读写:
pascal复制// 读取参数组
MB_MASTER(
REQ := TRUE,
MB_ADDR := 1,
FUNC := 3,
DB_NO := 50,
START := 40100, // 参数起始地址
NUM := 20, // 参数数量
ERROR => MB_ERROR,
STATUS => MB_STATUS
);
// 写入参数组
MB_MASTER(
REQ := TRUE,
MB_ADDR := 1,
FUNC := 16,
DB_NO := 50,
START := 40100,
NUM := 20,
ERROR => MB_ERROR,
STATUS => MB_STATUS
);
在实际项目中,这套系统已经成功应用于多个恒压供水、传送带控制等场景。最关键的体会是:通讯稳定性是基础,必须做好线路防护和参数匹配;PID控制效果很大程度上取决于参数整定,需要根据现场实际情况耐心调试;良好的人机界面能显著降低操作难度,提高系统可用性。