// 初始化Modbus RTU主站(需配置硬件接口)
"MB_MASTER_DB"(REQ := TRUE,
MB_ADDR := 1, // 驱动器站号
MB_BAUD := 9600, // 波特率
MB_PARITY := 0, // 无校验(8N1)
MB_DB := "Modbus_DB");
FUNCTION_BLOCK "FB_SV660P_Control"
VAR_INPUT
// 控制命令
Enable : BOOL; // 电机使能
Set_Speed_Pos : REAL; // 正向速度(rpm)
Set_Speed_Neg : REAL; // 反向速度(rpm)
Set_Accel : REAL; // 加速度(rpm/s²)
Set_Decel : REAL; // 减速度(rpm/s²)
Move_Pos_Steps : DINT; // 正向步数
Move_Neg_Steps : DINT; // 反向步数
Go_Home : BOOL; // 回原点命令
END_VAR
VAR_OUTPUT
Encoder_Value : DINT; // 编码器反馈
DI_Status : WORD; // DI状态(Bit0:DI1, Bit1:DI2, Bit2:光电)
Alarm_Code : INT; // 报警代码
Status : STRING[20]; // 状态信息
END_VAR
VAR
// Modbus通信临时变量
MB_Data : ARRAY[0..15] OF WORD;
MB_Error : WORD;
END_VAR
// 写入0x2000寄存器
IF Enable THEN
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#06, // 功能码06(写单寄存器)
ADDR := 16#2000, // 地址
COUNT := 1,
DATA_PTR := ADR(MB_Data));
MB_Data[0] := 1; // 1=使能
ELSE
MB_Data[0] := 0; // 0=关闭
END_IF;
// 正向速度(0x2001, 32位)
MB_Data[0] := WORD_TO_INT(REAL_TO_WORD(Set_Speed_Pos * 100)); // 转换为0.01rpm单位
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#10, // 功能码16(写多寄存器)
ADDR := 16#2001,
COUNT := 2,
DATA_PTR := ADR(MB_Data));
// 正向步数(0x2008)
MB_Data[0] := DINT_TO_WORD(Move_Pos_Steps);
MB_Data[1] := DINT_TO_WORD(Move_Pos_Steps SHR 16); // 高16位
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#10,
ADDR := 16#2008,
COUNT := 2,
DATA_PTR := ADR(MB_Data));
IF Go_Home THEN
// 1. 启动回零(0x200A=1)
MB_Data[0] := 1;
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#06,
ADDR := 16#200A,
COUNT := 1,
DATA_PTR := ADR(MB_Data));
// 2. 监控DI1(超程开关)
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#03,
ADDR := 16#3002, // DI状态地址
COUNT := 1,
DATA_PTR := ADR(DI_Status));
// 3. 停止条件
IF (DI_Status AND 16#01) <> 0 THEN // Bit0=DI1触发
Status := 'Home Done';
END_IF;
END_IF;
// 读取DI状态(0x3002)
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#03,
ADDR := 16#3002,
COUNT := 1,
DATA_PTR := ADR(DI_Status));
// 光电触发(Bit2)时急停
IF (DI_Status AND 16#04) <> 0 THEN
MB_Data[0] := 0; // 速度=0
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#06,
ADDR := 16#2001,
COUNT := 1,
DATA_PTR := ADR(MB_Data));
Status := 'Photo Stop';
END_IF;
// 读取报警代码(0x5000)
"MB_MASTER_DB"(REQ := TRUE,
FUNC := 16#03,
ADDR := 16#5000,
COUNT := 1,
DATA_PTR := ADR(Alarm_Code));
// 错误处理
IF Alarm_Code <> 0 THEN
Status := CONCAT('Error: ', INT_TO_STRING(Alarm_Code));
END_IF;
// 实例化功能块
"SV660P_CTRL"(
Enable := TRUE,
Set_Speed_Pos := 300.0, // 300rpm
Set_Accel := 100.0, // 100rpm/s²
Move_Pos_Steps := 10000, // 10000脉冲
Go_Home := TRUE); // 启动回零
// 获取输出
Encoder_Value := "SV660P_CTRL".Encoder_Value;
Alarm_Code := "SV660P_CTRL".Alarm_Code;
IF "MB_MASTER_DB".DONE THEN
// 处理成功
ELSIF "MB_MASTER_DB".ERROR THEN
Status := 'Comm Error';
END_IF;
IF Set_Speed_Pos > 3000.0 THEN
Set_Speed_Pos := 3000.0; // 限制最大速度
END_IF;