0% found this document useful (0 votes)
11 views14 pages

code_mod

This document outlines a function block for communication with three PLC-controlled inverters, initializing communication flags and setting motor parameters. It includes logic for speed limits, PID adjustments, and communication protocols for different inverter types. The document also details the handling of data transmission and reception, including frequency calculations and command structures for different devices.

Uploaded by

tuấn phạm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views14 pages

code_mod

This document outlines a function block for communication with three PLC-controlled inverters, initializing communication flags and setting motor parameters. It includes logic for speed limits, PID adjustments, and communication protocols for different inverter types. The document also details the handling of data transmission and reception, including frequency calculations and command structures for different devices.

Uploaded by

tuấn phạm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 14

(*

此函数块主要用于 PLC 三台变频器的通讯;


*)
//初始化数据
"sysData".com["INVERTER"].commSuccessFlag := FALSE;
"sysData".com["INVERTER"].txSuccessFlag := FALSE;
"sysData".com["INVERTER"].rxSuccessFlag := FALSE;
"sysData".com["INVERTER"].commFaultFalg := FALSE;
"sysData".com["INVERTER"].cardMaxNu := LIMIT(MN := 1, IN := 3, MX := 3);
//设置电机极对数;
"sysData".vfd["SPINDLE"].electrodeNum := 1;
"sysData".vfd["WINDING"].electrodeNum := 2;
"sysData".vfd["OVERFEED"].electrodeNum := 2;
//获取设定转速;
(*这里 limit 的最大值=变频器设定最大频率*60/极对数,这里忽略转差率*)
"sysData".vfd["SPINDLE"].setSpeed := LIMIT(MN := 0, IN := #spindleSpeed, MX :=
11400);
"sysData".vfd["WINDING"].setSpeed := LIMIT(MN := 0, IN := #windleSpeed, MX :=
2500);
"sysData".vfd["OVERFEED"].setSpeed := LIMIT(MN := 0, IN := #overfeedSpeed, MX :=
2500);
CASE BYTE_TO_USINT(#Motor_Type) OF
0: // Statement section case 1
#motor_coff := 1.018;
1: // Statement section case 2 to 4
#motor_coff := 1.0;
ELSE // Statement section ELSE
#motor_coff := 1.018;
END_CASE;

//状态切换
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;

You might also like