code_mod
code_mod
//状态切换
IF "sysData".com["INVERTER"].txFinishFlag = FALSE THEN
"sysData".com["INVERTER"].portStatus := "TX";
"sysData".com["INVERTER"].txStart := TRUE;
ELSIF "sysData".com["INVERTER"].txFinishFlag = TRUE THEN
"sysData".com["INVERTER"].portStatus := "RX";
"sysData".com["INVERTER"].txStart := FALSE;
END_IF;
"R_TRIG_VFD_txTrigger"(CLK := "sysData".com["INVERTER"].txStart,
Q => #txTrigger);
IF #txTrigger = TRUE THEN
//vfd 寻址;
IF ("sysData".com["INVERTER"].cardIndex < "sysData".com["INVERTER"].cardMaxNu)
AND ("sysData".com["INVERTER"].cardIndex <> 0) THEN
"sysData".com["INVERTER"].cardIndex := "sysData".com["INVERTER"].cardIndex
+ 1;
ELSE
"sysData".com["INVERTER"].cardIndex := 1;
END_IF;
//调节前数据处
理----------------------------------------------------------------------------------
-------------------------------------------------------------------------------
//理论频率计算(需要进行更改齿轮比)
"sysData".vfd[0].theoryFrequency := REAL_TO_DINT("sysData".vfd[0].setSpeed *
USINT_TO_REAL("sysData".vfd[0].electrodeNum) * 100.0 / 60.0 * #motor_coff);
"sysData".vfd[1].theoryFrequency := REAL_TO_DINT("sysData".vfd[1].setSpeed * "全
部数据".Control_Move.Coffienit_out.Z6 / "全部数据".Control_Move.Coffienit_out.Z5 * "全部数
据".Control_Move.Coffienit_out.Coffienit_winding / 30.0 * 100 *
#nonsynchronize_motor_coff);
"sysData".vfd[2].theoryFrequency := REAL_TO_DINT("sysData".vfd[2].setSpeed * "全
部数据".Control_Move.Coffienit_out.Z2 / "全部数据".Control_Move.Coffienit_out.Z1 * "全部数
据".Control_Move.Coffienit_out.Z4 / "全部数据".Control_Move.Coffienit_out.Z3 * "全部数
据".Control_Move.Coffienit_out.Coffienit_Capstan / 30 * 100 *
#nonsynchronize_motor_coff);
//获取 PID 调节值
#getValue[0].adjustValue := "sysData".vfd[0].pid.output;
#getValue[1].adjustValue := "sysData".vfd[1].pid.output;
#getValue[2].adjustValue := "sysData".vfd[2].pid.output;
//变频器种类区分
CASE ["YASKAWA_DEVICE", "BONFIGLIOLI_DEVICE", "BONFIGLIOLI_DEVICE"] OF
"YASKAWA_DEVICE":
//*******************************************ABB 变频器通讯写从新修改方式**********
*************************//
//锭子速度上下限
#Uint_H := REAL_TO_UINT(#"SPD-SetSpeed" * 1.05);
#Uint_L := REAL_TO_UINT(#"SPD-SetSpeed" * 0.95);
//正常开锭位,平均定速正常则要调用 pid;
IF ("sysData".dsp.onNum <> 0) AND ("sysData".glv.spSpeedAvg > #Uint_L)
AND (#"PID-EN_Signal_0" = TRUE) THEN
//如果正常情况下,开钉子,并且速度达到下限要开启 PID 自整定功能
#getValue[0].frequency := LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[0].theoryFrequency) * 0.9), IN :=
CEIL(#getValue[0].adjustValue * 40.0) + ("sysData".vfd[0].theoryFrequency), MX :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[0].theoryFrequency) * 1.10));
ELSE
//没有开锭位且平均锭速为零的时候 pid 没有反馈,因此给多少转速换算成理论频率写;
#getValue[0].frequency := "sysData".vfd[0].theoryFrequency;
END_IF;
//超喂变频器和卷绕变频器的闭环控制
IF #"PID-EN_Signal_1" = TRUE THEN
// 开启闭环控制
//#getValue[1].frequency :=
"sysData".vfd[1].theoryFrequency+REAL_TO_DINT(#getValue[1].adjustValue);
#getValue[1].frequency := LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[1].theoryFrequency) * 0.9), IN :=
"sysData".vfd[1].theoryFrequency + REAL_TO_DINT(#getValue[1].adjustValue), MX :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[1].theoryFrequency) * 1.05));
ELSE
//不开启闭环控制,下发理论频率
#getValue[1].frequency := "sysData".vfd[1].theoryFrequency;
END_IF;
IF #"PID-EN_Signal_2" = TRUE THEN
// 开启闭环控制
//#getValue[2].frequency :=
"sysData".vfd[2].theoryFrequency+REAL_TO_DINT(#getValue[2].adjustValue*5);
#getValue[2].frequency := LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[2].theoryFrequency) * 0.9), IN :=
"sysData".vfd[2].theoryFrequency + REAL_TO_DINT(#getValue[2].adjustValue * 5),
MX := REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[2].theoryFrequency) * 1.1));
ELSE
//不开启闭环控制,下发理论频率
#getValue[2].frequency := "sysData".vfd[2].theoryFrequency;
END_IF;
"sysData".vfd[0].write.frequency :=
DINT_TO_DWORD(ROUND(DINT_TO_REAL(#getValue[0].frequency) / 100.0 * 20000.0 /
190.0));
"sysData".vfd[1].write.frequency :=
DINT_TO_DWORD(ROUND(DINT_TO_REAL(#getValue[1].frequency) / 100.0 * 20000.0 /
120.0));
"sysData".vfd[2].write.frequency :=
DINT_TO_DWORD(ROUND(DINT_TO_REAL(#getValue[2].frequency) / 100.0 * 20000.0 /
120.0));
"sysData".vfd[0].write.show :=
(ROUND(DINT_TO_REAL(#getValue[0].frequency) / 100.0 * 20000.0 / 190.0));
"sysData".vfd[1].write.show :=
(ROUND(DINT_TO_REAL(#getValue[1].frequency) / 100.0 * 20000.0 / 190.0));
"sysData".vfd[2].write.show :=
(ROUND(DINT_TO_REAL(#getValue[2].frequency) / 100.0 * 20000.0 / 190.0));
CASE "sysData".glv.mbsMode OF
"WRITE":
(*1103:设定值为 8 选择通讯设定频率*,寄存器 0111:外部给定 1 寄存器*)
"sysData".com["INVERTER"].commTxBuffer[0] :=
USINT_TO_BYTE("sysData".com["INVERTER"].cardIndex);
"sysData".com["INVERTER"].commTxBuffer[1] := 16#06;//func:写单个寄存
器
"sysData".com["INVERTER"].commTxBuffer[2] := 16#00;//regH: 寄存器高
字节
"sysData".com["INVERTER"].commTxBuffer[3] := 16#02;//regL: 寄存器低
字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 5;
IF "sysData".com["INVERTER"].cardIndex =
"sysData".com["INVERTER"].cardMaxNu THEN
"sysData".glv.mbsMode := "READ";
END_IF;
"READ":
//可分多组读写,因为有的寄存器不连续;
//切换分组;
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command := "GROUP1_DATA";
//("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command + 1) MOD 3;
CASE "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command OF
"GROUP1_DATA": // 第一组寄存器 运行数据;(*103 频率; 104 电流;寄存器个数
16#02*)
#mbsData.regAdd.Hi := 16#00;
#mbsData.regAdd.Lo := 16#24;
#mbsData.datnum.Hi := 16#00;
#mbsData.datnum.Lo := 16#03;
"GROUP2_DATA": // 第二组寄存器 故障状态字;(*0305 故障字 1)
#mbsData.regAdd.Hi := 16#01;
#mbsData.regAdd.Lo := 16#29;
#mbsData.datnum.Hi := 16#00;
#mbsData.datnum.Lo := 16#01;
ELSE
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command := "GROUP1_DATA";
END_CASE;
IF "sysData".com["INVERTER"].cardIndex =
"sysData".com["INVERTER"].cardMaxNu THEN
"sysData".glv.mbsMode := "WRITE";
END_IF;
//发数据;
"sysData".com["INVERTER"].commTxBuffer[0] :=
USINT_TO_BYTE("sysData".com["INVERTER"].cardIndex);
"sysData".com["INVERTER"].commTxBuffer[1] := 16#03;//func:读多个寄存
器
"sysData".com["INVERTER"].commTxBuffer[2] :=
#mbsData.regAdd.Hi;
"sysData".com["INVERTER"].commTxBuffer[3] :=
#mbsData.regAdd.Lo;
"sysData".com["INVERTER"].commTxBuffer[4] :=
#mbsData.datnum.Hi;
"sysData".com["INVERTER"].commTxBuffer[5] :=
#mbsData.datnum.Lo;
#mbsData.txLength := 5;
ELSE
"sysData".glv.mbsMode := "WRITE";
END_CASE;
//*******************************************ABB 变频器通讯写从新修改方式**********
*************************//
"BONFIGLIOLI_DEVICE":
//锭子速度上下限
#Uint_H := REAL_TO_UINT(#"SPD-SetSpeed" * 1.05);
#Uint_L := REAL_TO_UINT(#"SPD-SetSpeed" * 0.95);
IF #losePowerSignal = FALSE THEN
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].pid.stableFlag := FALSE;
END_IF;
//锭子变频器还是其它的变频器的判断区分
//正常开锭位,平均定速正常则要调用 pid;
IF ("sysData".dsp.onNum <> 0) AND ("sysData".glv.spSpeedAvg > #Uint_L)
AND (#"PID-EN_Signal_0" = TRUE) THEN
//如果正常情况下,开钉子,并且速度达到下限要开启 PID 自整定功能
//#getValue["sysData".com["INVERTER"].cardIndex - 1].frequency :=
CEIL(#getValue["sysData".com["INVERTER"].cardIndex -
1].adjustValue*100.0)+REAL_TO_DINT(DINT_TO_REAL("sysData".vfd["sysData".com["INVERT
ER"].cardIndex - 1].theoryFrequency)*1.0);
IF "全部数据"."HMI-Process-out".Direction = 1 THEN
#getValue[0].frequency := LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[0].theoryFrequency) * 0.9), IN :=
CEIL(#getValue[0].adjustValue * 100.0) + ("sysData".vfd[0].theoryFrequency), MX :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[0].theoryFrequency) * 1.06));
ELSE
#getValue[0].frequency := - LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[0].theoryFrequency) * 0.9), IN :=
CEIL(#getValue[0].adjustValue * 100.0) + ("sysData".vfd[0].theoryFrequency), MX :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[0].theoryFrequency) * 1.06));
END_IF;
ELSE
//没有开锭位且平均锭速为零的时候 pid 没有反馈,因此给多少转速换算成理论频率写;
IF "全部数据"."HMI-Process-out".Direction = 1 THEN
#getValue[0].frequency := "sysData".vfd[0].theoryFrequency;
ELSE
#getValue[0].frequency := - "sysData".vfd[0].theoryFrequency;
END_IF;
END_IF;
//超喂变频器和卷绕变频器的闭环控制
IF #"PID-EN_Signal_1" = TRUE THEN
// 开启闭环控制
//#getValue[1].frequency :=
"sysData".vfd[1].theoryFrequency+REAL_TO_DINT(#getValue[1].adjustValue);
#getValue[1].frequency := LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[1].theoryFrequency) * 0.9), IN :=
"sysData".vfd[1].theoryFrequency + REAL_TO_DINT(#getValue[1].adjustValue), MX :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[1].theoryFrequency) * 1.05));
ELSE
//不开启闭环控制,下发理论频率
#getValue[1].frequency := "sysData".vfd[1].theoryFrequency;
END_IF;
IF #"PID-EN_Signal_2" = TRUE THEN
// 开启闭环控制
//#getValue[2].frequency :=
"sysData".vfd[2].theoryFrequency+REAL_TO_DINT(#getValue[2].adjustValue*5);
#getValue[2].frequency := LIMIT(MN :=
REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[2].theoryFrequency) * 0.9), IN :=
"sysData".vfd[2].theoryFrequency + REAL_TO_DINT(#getValue[2].adjustValue * 5),
MX := REAL_TO_DINT(DINT_TO_REAL("sysData".vfd[2].theoryFrequency) * 1.1));
ELSE
//不开启闭环控制,下发理论频率
#getValue[2].frequency := "sysData".vfd[2].theoryFrequency;
END_IF;
//下发频率,发给变频器的 Dword 类型数据
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency := DINT_TO_DWORD(#getValue["sysData".com["INVERTER"].cardIndex -
1].frequency);
IF #getValue["sysData".com["INVERTER"].cardIndex - 1].frequency < 0
THEN
// Statement section IF
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.show := - #getValue["sysData".com["INVERTER"].cardIndex - 1].frequency;
ELSE
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.show := #getValue["sysData".com["INVERTER"].cardIndex - 1].frequency;
END_IF;
//"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.show:=#getValue["sysData".com["INVERTER"].cardIndex - 1].frequency;
IF #losePowerSignal = FALSE THEN
// Statement section IF
CASE "sysData".com["INVERTER"].cardIndex OF
1: // 读取锭子频率
"sysData".vfd[0].gVarible.command := "GROUP1_DATA";
"sysData".com["INVERTER"].commTxBuffer[0] := 1;
"sysData".com["INVERTER"].commTxBuffer[1] := 16#64;
"sysData".com["INVERTER"].commTxBuffer[2] := 16#00;
"sysData".com["INVERTER"].commTxBuffer[3] := 16#F1;
#mbsData.txLength := 3;
2: // Statement section case 2 to 4
"sysData".com["INVERTER"].commTxBuffer[0] := 2;
"sysData".com["INVERTER"].commTxBuffer[1] := 16#65;//func:写
32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] := 16#01;//regH:
寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] := 16#E4;//regL:
寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#FF000000), N := 24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#00FF0000), N := 16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
3: // Statement section case 2 to 4
"sysData".com["INVERTER"].commTxBuffer[0] := 3;
"sysData".com["INVERTER"].commTxBuffer[1] := 16#65;//func:写
32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] := 16#01;//regH:
寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] := 16#E4;//regL:
寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#FF000000), N := 24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#00FF0000), N := 16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
ELSE // Statement section ELSE
"sysData".vfd[0].gVarible.command := "GROUP1_DATA";
"sysData".com["INVERTER"].commTxBuffer[0] := 1;
"sysData".com["INVERTER"].commTxBuffer[1] := 16#64;
"sysData".com["INVERTER"].commTxBuffer[2] := 16#00;
"sysData".com["INVERTER"].commTxBuffer[3] := 16#F1;
#mbsData.txLength := 3;
END_CASE;
ELSE
IF #Move_Status = 2 THEN
//循环运动时,通讯正常写和读取
CASE "sysData".glv.mbsMode OF
"WRITE":
"sysData".com["INVERTER"].commTxBuffer[0] :=
USINT_TO_BYTE("sysData".com["INVERTER"].cardIndex);
"sysData".com["INVERTER"].commTxBuffer[1] :=
16#65;//func:写 32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] :=
16#01;//regH: 寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] :=
16#E4;//regL: 寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#FF000000), N := 24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#00FF0000), N := 16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
IF "sysData".com["INVERTER"].cardIndex =
"sysData".com["INVERTER"].cardMaxNu THEN
"sysData".glv.mbsMode := "READ";
END_IF;
"READ":
//分组读写,因为寄存器不连续;
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command + 1) MOD 4;
CASE "sysData".vfd["sysData".com["INVERTER"].cardIndex
- 1].gVarible.command OF
"GROUP1_DATA": // 第一组寄存器 定子频率 241
#mbsData.regAdd.Hi := 16#00;
#mbsData.regAdd.Lo := 16#F1;
#mbsData.datnum.Hi := 16#00;
#mbsData.datnum.Lo := 16#01;
"GROUP2_DATA": // 第二组寄存器 有功电流 211
#mbsData.regAdd.Hi := 16#00;
#mbsData.regAdd.Lo := 16#D3;
#mbsData.datnum.Hi := 16#00;
#mbsData.datnum.Lo := 16#01;
"GROUP3_DATA": // 第三组寄存器 母线电压 213
#mbsData.regAdd.Hi := 16#00;
#mbsData.regAdd.Lo := 16#D5;
#mbsData.datnum.Hi := 16#00;
#mbsData.datnum.Lo := 16#01;
"GROUP4_DATA": // 第四组寄存器 故障状态 411
#mbsData.regAdd.Hi := 16#01;
#mbsData.regAdd.Lo := 16#03;
#mbsData.datnum.Hi := 16#00;
#mbsData.datnum.Lo := 16#01;
ELSE
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].gVarible.command :=
"GROUP1_DATA";
END_CASE;
IF "sysData".com["INVERTER"].cardIndex =
"sysData".com["INVERTER"].cardMaxNu THEN
"sysData".glv.mbsMode := "WRITE";
END_IF;
"sysData".com["INVERTER"].commTxBuffer[0] :=
USINT_TO_BYTE("sysData".com["INVERTER"].cardIndex);
IF "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command = "GROUP1_DATA" THEN
"sysData".com["INVERTER"].commTxBuffer[1] := 16#64;
"sysData".com["INVERTER"].commTxBuffer[2] :=
#mbsData.regAdd.Hi;
"sysData".com["INVERTER"].commTxBuffer[3] :=
#mbsData.regAdd.Lo;
#mbsData.txLength := 3;
ELSE
"sysData".com["INVERTER"].commTxBuffer[1] := 16#03;
"sysData".com["INVERTER"].commTxBuffer[2] :=
#mbsData.regAdd.Hi;
"sysData".com["INVERTER"].commTxBuffer[3] :=
#mbsData.regAdd.Lo;
"sysData".com["INVERTER"].commTxBuffer[4] :=
#mbsData.datnum.Hi;
"sysData".com["INVERTER"].commTxBuffer[5] :=
#mbsData.datnum.Lo;
#mbsData.txLength := 5;
END_IF;
ELSE
"sysData".glv.mbsMode := "WRITE";
END_CASE;
ELSE
//非失电状态,非循环运动状态只写入数据;
CASE "sysData".com["INVERTER"].cardIndex OF
1: // 读取锭子频率
"sysData".com["INVERTER"].commTxBuffer[0] := 1;
"sysData".com["INVERTER"].commTxBuffer[1] :=
16#65;//func:写 32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] :=
16#01;//regH: 寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] :=
16#E4;//regL: 寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#FF000000), N := 24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#00FF0000), N := 16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
"sysData".vfd[0].read.frequency :=
"sysData".vfd[0].setSpeed * USINT_TO_REAL("sysData".vfd[0].electrodeNum) / 60.0 *
#motor_coff;
2: // Statement section case 2 to 4
"sysData".com["INVERTER"].commTxBuffer[0] := 2;
"sysData".com["INVERTER"].commTxBuffer[1] :=
16#65;//func:写 32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] :=
16#01;//regH: 寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] :=
16#E4;//regL: 寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#FF000000), N := 24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#00FF0000), N := 16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
"sysData".vfd[1].read.frequency :=
"sysData".vfd[1].setSpeed * "全部数据".Control_Move.Coffienit_out.Z6 / "全部数
据".Control_Move.Coffienit_out.Z5 * "全部数
据".Control_Move.Coffienit_out.Coffienit_winding / 30 * #nonsynchronize_motor_coff;
3: // Statement section case 2 to 4
"sysData".com["INVERTER"].commTxBuffer[0] := 3;
"sysData".com["INVERTER"].commTxBuffer[1] :=
16#65;//func:写 32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] :=
16#01;//regH: 寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] :=
16#E4;//regL: 寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#FF000000), N := 24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#00FF0000), N := 16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#0000FF00), N := 8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
"sysData".vfd[2].read.frequency :=
"sysData".vfd[2].setSpeed * "全部数据".Control_Move.Coffienit_out.Z2 / "全部数
据".Control_Move.Coffienit_out.Z1 * "全部数据".Control_Move.Coffienit_out.Z4 / "全部数
据".Control_Move.Coffienit_out.Z3 * "全部数
据".Control_Move.Coffienit_out.Coffienit_Capstan / 30 * #nonsynchronize_motor_coff;
ELSE // Statement section ELSE
"sysData".com["INVERTER"].commTxBuffer[0] := 1;
"sysData".com["INVERTER"].commTxBuffer[1] :=
16#65;//func:写 32 位寄存器
"sysData".com["INVERTER"].commTxBuffer[2] :=
16#01;//regH: 寄存器高字节
"sysData".com["INVERTER"].commTxBuffer[3] :=
16#E4;//regL: 寄存器低字节
"sysData".com["INVERTER"].commTxBuffer[4] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd[0].write.frequency AND 16#FF000000), N :=
24));
"sysData".com["INVERTER"].commTxBuffer[5] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd[0].write.frequency AND 16#00FF0000), N :=
16));
"sysData".com["INVERTER"].commTxBuffer[6] :=
DWORD_TO_BYTE(SHR(IN := ("sysData".vfd[0].write.frequency AND 16#0000FF00), N :=
8));
"sysData".com["INVERTER"].commTxBuffer[7] :=
DWORD_TO_BYTE("sysData".vfd[0].write.frequency AND 16#000000FF);
#mbsData.txLength := 7;
"sysData".vfd[0].read.frequency :=
"sysData".vfd[0].setSpeed * USINT_TO_REAL("sysData".vfd[0].electrodeNum) / 60.0 *
#motor_coff;
END_CASE;
END_IF;
END_IF;
END_CASE;
//计算校验核;#mbsData.txLength
#mbsData.crc.crcReturn := 16#FFFF;
FOR #mbsData.crc.crcIndex := 0 TO #mbsData.txLength BY 1 DO
#mbsData.crc.crcReturn := #mbsData.crc.crcReturn XOR
BYTE_TO_WORD("sysData".com["INVERTER"].commTxBuffer[#mbsData.crc.crcIndex]);
FOR #mbsData.crc.bitIndex := 0 TO 7 BY 1 DO
IF (#mbsData.crc.crcReturn AND 16#0001) = 16#0001 THEN
#mbsData.crc.crcReturn := SHR(IN := #mbsData.crc.crcReturn, N :=
1);
#mbsData.crc.crcReturn := #mbsData.crc.crcReturn XOR 16#A001;
ELSE
#mbsData.crc.crcReturn := SHR(IN := #mbsData.crc.crcReturn, N :=
1);
END_IF;
END_FOR;
END_FOR;
"sysData".com["INVERTER"].commTxBuffer[#mbsData.txLength + 1] :=
WORD_TO_BYTE(#mbsData.crc.crcReturn & 16#FF);
"sysData".com["INVERTER"].commTxBuffer[#mbsData.txLength + 2] :=
WORD_TO_BYTE(SHR(IN := #mbsData.crc.crcReturn, N := 8));
END_IF;
//启动状态机
CASE "sysData".com["INVERTER"].portStatus OF
"TX":
"SEND_PTP_INVERTER"(REQ := #txTrigger,
"PORT" := "Local~CM_1241_(RS422_485)Port1_1",
BUFFER := "sysData".com["INVERTER"].commTxBuffer,
LENGTH := INT_TO_UINT(#mbsData.txLength + 3),
PTRCL := FALSE,
DONE => "sysData".com["INVERTER"].txStatus.doneStatus,
ERROR => "sysData".com["INVERTER"].txStatus.errStatus,
STATUS => "sysData".com["INVERTER"].txStatus.errCode);
IF "sysData".com["INVERTER"].txStatus.doneStatus = TRUE THEN
"sysData".com["INVERTER"].txSuccessFlag := TRUE;
"sysData".com["INVERTER"].txFinishFlag := TRUE;
"sysData".com["INVERTER"].timeOut.tx := 0;
ELSIF "sysData".com["INVERTER"].timeOut.tx >= "VHF_TX_TIMEOUT" THEN
"sysData".com["INVERTER"].timeOut.tx := 0;
"sysData".com["INVERTER"].txFinishFlag := TRUE;
END_IF;
"sysData".com["INVERTER"].timeOut.tx :=
"sysData".com["INVERTER"].timeOut.tx + 1;
"RX":
"RCV_PTP_INVERTER"(EN_R := "sysData".com["INVERTER"].txFinishFlag,
"PORT" := "Local~CM_1241_(RS422_485)Port1_1",
BUFFER := "sysData".com["INVERTER"].commRxBuffer,
NDR => "sysData".com["INVERTER"].rxStatus.doneStatus,
ERROR => "sysData".com["INVERTER"].rxStatus.errStatus,
STATUS => "sysData".com["INVERTER"].rxStatus.errCode,
LENGTH => "sysData".com["INVERTER"].rxStatus.rxLength);
"F_TRIG_VFD_rxDone"(CLK := "sysData".com["INVERTER"].rxStatus.doneStatus,
Q => "sysData".com["INVERTER"].rxFinishFlag);
IF "sysData".com["INVERTER"].rxFinishFlag = TRUE THEN
"sysData".com["INVERTER"].txFinishFlag := FALSE;
"sysData".com["INVERTER"].rxSuccessFlag := TRUE;
"sysData".com["INVERTER"].timeOut.rx := 0;
//设定 RX_TIMEOUT 个周期的超时时间;
ELSIF "sysData".com["INVERTER"].timeOut.rx >= "VHF_RX_TIMEOUT" THEN
"sysData".com["INVERTER"].timeOut.rx := 0;
"sysData".com["INVERTER"].commFaultFalg := TRUE;
"sysData".com["INVERTER"].txFinishFlag := FALSE;
END_IF;
"sysData".com["INVERTER"].timeOut.rx :=
"sysData".com["INVERTER"].timeOut.rx + 1;
ELSE
"sysData".com["INVERTER"].portStatus := "TX";
END_CASE;
//接收报文解析;
IF "sysData".com["INVERTER"].rxFinishFlag = TRUE THEN
"sysData".com["INVERTER"].rxFinishFlag := FALSE;
IF "sysData".com["INVERTER"].rxStatus.rxLength > 3 THEN
#mbsData.rxLength :=
UINT_TO_INT("sysData".com["INVERTER"].rxStatus.rxLength - 3);
END_IF;
#mbsData.crc.crcReturn := 16#FFFF;
FOR #mbsData.crc.crcIndex := 0 TO #mbsData.rxLength BY 1 DO
#mbsData.crc.crcReturn := #mbsData.crc.crcReturn XOR
BYTE_TO_WORD("sysData".com["INVERTER"].commRxBuffer[#mbsData.crc.crcIndex]);
FOR #mbsData.crc.bitIndex := 0 TO 7 BY 1 DO
IF (#mbsData.crc.crcReturn AND 16#0001) = 16#0001 THEN
#mbsData.crc.crcReturn := SHR(IN := #mbsData.crc.crcReturn, N :=
1);
#mbsData.crc.crcReturn := #mbsData.crc.crcReturn XOR 16#A001;
ELSE
#mbsData.crc.crcReturn := SHR(IN := #mbsData.crc.crcReturn, N :=
1);
END_IF;
END_FOR;
END_FOR;
#mbsData.crc.rxCRCHi := WORD_TO_BYTE(#mbsData.crc.crcReturn & 16#FF);
#mbsData.crc.rxCRCLo := WORD_TO_BYTE(SHR(IN := #mbsData.crc.crcReturn, N :=
8));
IF #mbsData.crc.rxCRCHi =
"sysData".com["INVERTER"].commRxBuffer[#mbsData.rxLength + 1] AND
#mbsData.crc.rxCRCLo = "sysData".com["INVERTER"].commRxBuffer[#mbsData.rxLength +
2] THEN
IF "sysData".com["INVERTER"].commRxBuffer[0] =
USINT_TO_BYTE("sysData".com["INVERTER"].cardIndex) THEN
//crc 校验通过;
"sysData".com["INVERTER"].commSuccessFlag := TRUE;
//在这里解析数据:
CASE ["YASKAWA_DEVICE", "BONFIGLIOLI_DEVICE", "BONFIGLIOLI_DEVICE"] OF
"YASKAWA_DEVICE":
IF "sysData".com["INVERTER"].commRxBuffer[1] = 16#03 THEN
CASE "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command OF
"GROUP1_DATA":
#temp := SHL(IN :=
BYTE_TO_WORD("sysData".com["INVERTER"].commRxBuffer[3]), N := 8);
#"16bitData" := #temp OR
"sysData".com["INVERTER"].commRxBuffer[4];
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.frequency := UINT_TO_REAL(WORD_TO_UINT(#"16bitData")) / 100.0;
//频率
#temp := SHL(IN :=
BYTE_TO_WORD("sysData".com["INVERTER"].commRxBuffer[5]), N := 8);
#"16bitData" := #temp OR
"sysData".com["INVERTER"].commRxBuffer[6];
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.voltage := UINT_TO_REAL(WORD_TO_UINT(#"16bitData")) / 10.0;
//电流
#temp := SHL(IN :=
BYTE_TO_WORD("sysData".com["INVERTER"].commRxBuffer[7]), N := 8);
#"16bitData" := #temp OR
"sysData".com["INVERTER"].commRxBuffer[8];
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.current := UINT_TO_REAL(WORD_TO_UINT(#"16bitData")) / 10.0;
//电流
"GROUP2_DATA":
#temp := SHL(IN :=
BYTE_TO_WORD("sysData".com["INVERTER"].commRxBuffer[3]), N := 8);
#"16bitData" := #temp OR
"sysData".com["INVERTER"].commRxBuffer[4];
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.faultCode.ABB := #"16bitData";
//故障
ELSE
;
END_CASE;
END_IF;
"BONFIGLIOLI_DEVICE":
//("sysData".com["INVERTER"].commRxBuffer[1] = 16#03)
OR("sysData".com["INVERTER"].commRxBuffer[1]=16#64)
IF ("sysData".com["INVERTER"].commRxBuffer[1] <> 16#65) THEN
CASE "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].gVarible.command OF
//频率
"GROUP1_DATA":
#"32bitData1" :=
"sysData".com["INVERTER"].commRxBuffer[2];
#"32bitData2" :=
"sysData".com["INVERTER"].commRxBuffer[3];
#dwordBuffer1 := SHL(IN := #"32bitData1", N := 24)
OR SHL(IN := #"32bitData2", N := 16);
#"32bitData1" :=
"sysData".com["INVERTER"].commRxBuffer[4];
#"32bitData2" :=
"sysData".com["INVERTER"].commRxBuffer[5];
#dwordBuffer2 := SHL(IN := #"32bitData1", N := 8)
OR #"32bitData2";
#readBuffer := DWORD_TO_DINT(#dwordBuffer1 OR
#dwordBuffer2);
IF #readBuffer < 0 THEN
// Statement section IF
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].read.frequency := -
DINT_TO_REAL(#readBuffer) / 100;
ELSE
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].read.frequency :=
DINT_TO_REAL(#readBuffer) / 100;
END_IF;
//"sysData".vfd["sysData".com["INVERTER"].cardIndex
- 1].read.frequency := DINT_TO_REAL(#readBuffer)/100;
//电流
"GROUP2_DATA":
#temp := "sysData".com["INVERTER"].commRxBuffer[3];
#"16bitData" := SHL(IN := #temp, N := 8) OR
"sysData".com["INVERTER"].commRxBuffer[4];
#readBuffer := WORD_TO_DINT(#"16bitData");
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.current := DINT_TO_REAL(#readBuffer) / 10;
//电压
"GROUP3_DATA":
#temp :=
("sysData".com["INVERTER"].commRxBuffer[3]);
#"16bitData" := SHL(IN := #temp, N := 8) OR
("sysData".com["INVERTER"].commRxBuffer[4]);
#readBuffer := WORD_TO_DINT(#"16bitData");
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.voltage := DINT_TO_REAL(#readBuffer) / 10;
IF
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].read.voltage > 6550 THEN
// Statement section IF
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].read.voltage := 0;
END_IF;
//状态
"GROUP4_DATA":
#temp := "sysData".com["INVERTER"].commRxBuffer[3];
#"16bitData" := SHL(IN := #temp, N := 8) OR
"sysData".com["INVERTER"].commRxBuffer[4];
#readBuffer := WORD_TO_DINT(#"16bitData");
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].read.faultCode.BONFIGLIOLI := DINT_TO_WORD(#readBuffer);
ELSE
;
END_CASE;
END_IF;
END_CASE;
END_IF;
END_IF;
//清除缓存
FOR #clearIndex := 0 TO #mbsData.rxLength BY 1 DO
"sysData".com["INVERTER"].commRxBuffer[#clearIndex] := 0;
END_FOR;
END_IF;
//监测通讯数据
IF "sysData".com["INVERTER"].txSuccessFlag = TRUE THEN
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].commStatus.txCunter :=
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].commStatus.txCunter + 1;
END_IF;
IF "sysData".com["INVERTER"].rxSuccessFlag = TRUE THEN
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].commStatus.rxCunter :=
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].commStatus.rxCunter + 1;
END_IF;
//修改部分
IF "sysData".com["INVERTER"].commSuccessFlag = TRUE THEN
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.sucessCunter := "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.sucessCunter + 1;
//清除通讯故障标识和故障延时计数器;
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].commStatus.commFault :=
false;
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.commFaultDly := 0;
ELSIF "sysData".com["INVERTER"].commFaultFalg = TRUE THEN
//丢包;
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.faultCunter := "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.faultCunter + 1;
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.commFaultDly := "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.commFaultDly + 1;
//掉线,连续 COMM_FAULT_TIME 个周期通讯故障认为掉线,否则为丢包;
IF "sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.commFaultDly >= "COMM_FAULT_TIME" THEN
"sysData".vfd["sysData".com["INVERTER"].cardIndex -
1].commStatus.commFaultDly := 0;
"sysData".vfd["sysData".com["INVERTER"].cardIndex - 1].commStatus.commFault
:= TRUE;
//在这里处理通讯失败后的相关数据;
END_IF;
END_IF;