PROGRAM CAN
VAR
j: INT;
i: INT;
OLDIdent: UINT;
END_VAR
IF Input_RxCounter <=1 THEN
Output_RxCounter:=0;
END_IF
IF Input_RxCounter>Output_RxCounter THEN (*Handshake: wurden CAN-Telegramme empfangen, so wird vom System der Input_RxCounter erhöht*)
(*--------------------------------- Messages empfangen ----------------------------------*)
(*Es werden immer bis zu 10 Telegramme empfangen, Wie viele tatsächlich empfangen wurden steht in Input_NoOfRxMessages.
Ein Telegramm ist folgendermaßen aufgebaut:
- CobId
o Bit 0-3: Length (0..8)
o Bit 4: RTR
o Bit 5-15: 11 Bit-Identifier
- Data[8]
Die Daten kommen von der Klemme als Rohdaten, d.h. die nCobId muss noch zerpflückt werden. Dies geschieht im folgenden Programmteil. Die Messages
werden dann in ein Message-Array geschrieben.
*)
FOR i:=0 TO (Input_NoOfRxMessages-1) BY 1 DO (*Schleife wird so oft durchlaufen wie Messages empfangen wurden*)
Messages[i].Length :=DWORD_TO_UINT(INT_TO_DWORD( Input_RxMessages[i].cobID) AND INT_TO_DWORD(2#1111)); (*Ausmasklieren der Length Bit 0-3*)
Messages[i].RTR:= Input_RxMessages[i].cobID.4; (*RTR*)
Messages[i].Identifier:=SHR(Input_RxMessages[i].cobID,5); (*Identifier durch Rechtsschieben auslesen *)
FOR j:=0 TO (Messages[i].Length-1) BY 1 DO (*Schleife wird so oft durchlaufen wie Daten im entspr. Telegramm vorhanden sind*)
Messages[i].rxData[j]:=Input_RxMessages[i].rxData[j]; (*Daten kopieren*)
END_FOR
END_FOR
Output_RxCounter:=Output_RxCounter+1; (*Handshake: wurde ein CAN-Telegramm empfangen, so wird hier von der Software der Output_RxCounter erhöht,
das System empfängt dann neue Telegramme *)
(*--------------------------------- Werte aus den Messages auslesen ----------------------------------*)
FOR i:=0 TO (Input_NoOfRxMessages-1) BY 1 DO (*Schleife wird so oft durchlaufen wie Messages empfangen wurden*)
(*Zum Suchen nach destimmten Identifieren im CAN-Bus, bedienbar über VISU*)
IF Messages[i].Identifier = CAN_uiIdentifierSuche THEN
CAN_bIdentifierGefunden := TRUE;
END_IF
CASE Messages[i].Identifier OF
(*BO_ 1310 B_Druck_1: 8 P8_876678
SG_ P_1 : 0|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs
SG_ P_2 : 16|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs
SG_ P_3 : 32|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs
SG_ P_4 : 48|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs*)
1310:
Druck1_SG_P_1_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
Druck1_SG_P_2_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
Druck1_SG_P_3_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
Druck1_SG_P_4_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Druck_1_Ct:=0;
(*BO_ 1320 B_Druck_2: 8 P8_876678
SG_ P_5 : 0|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs
SG_ P_6 : 16|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs
SG_ P_7 : 32|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs
SG_ P_8 : 48|16@1- (0.000152593,4) [-1.00015|9] "'bar'" uMusycs*)
1320:
Druck2_SG_P_5_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
Druck2_SG_P_6_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
Druck2_SG_P_7_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
Druck2_SG_P_8_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Druck2_Ct:=0;
(*BO_ 1410 B_Temp_1: 8 SC16_876971
SG_ T_1 : 0|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_2 : 16|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_3 : 32|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_4 : 48|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs*)
1421:
Temp1_SG_T_1_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
Temp1_SG_T_2_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
Temp1_SG_T_3_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
Temp1_SG_T_4_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Temp1_Ct:=0;
(*BO_ 1420 B_Temp_2: 8 SC16_876971
SG_ T_5 : 0|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_6 : 16|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_7 : 32|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_8 : 48|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs*)
1420:
Temp2_SG_T_5_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
Temp2_SG_T_6_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
Temp2_SG_T_7_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
Temp2_SG_T_8_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Temp2_Ct:=0;
(*BO_ 1430 B_Temp_3: 8 SC16_876971
SG_ T_9 : 0|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_10 : 16|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_11 : 32|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_12 : 48|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs*)
1430:
Temp3_SG_T_9_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
Temp3_SG_T_10_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
Temp3_SG_T_11_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
Temp3_SG_T_12_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Temp3_Ct:=0;
(*BO_ 1440 B_Temp_4: 8 SC16_876971
SG_ T_13 : 0|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_14 : 16|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_15 : 32|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs
SG_ T_16 : 48|16@1- (0.0230876,485) [-271.534|1241.51] "°C" uMusycs*)
1440:
Temp4_SG_T_13_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
Temp4_SG_T_14_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
Temp4_SG_T_15_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
Temp4_SG_T_16_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Temp4_Ct:=0;
(*BO_ 1120 B_AI_2: 8 UNI8_876773
SG_ AI_5 : 0|16@1- (0.00061037,0) [-20.0006|20] "V" uMusycs
SG_ AI_6 : 16|16@1- (0.000305185,0) [-10.0003|10] "V" uMusycs
SG_ AI_7 : 32|16@1- (0.00915512,0.010278) [-299.985|299.996] "l/min" uMusycs
SG_ AI_8 : 48|16@1- (0.00152593,0) [-50.0015|50] "V" uMusycs*)
1120:
AI2_SG_AI_5_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
AI2_SG_AI_6_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
AI2_SG_AI_7_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
AI2_SG_AI_8_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_AI2_Ct:=0;
(*BO_ 1110 B_AI_1: 8 UNI8_876773
SG_ Md_VL : 0|16@1- (0.122074,0) [-4000.12|4000] "Nm" uMusycs
SG_ Md_VR : 16|16@1- (0.122074,0) [-4000.12|4000] "Nm" uMusycs
SG_ Md_HL : 32|16@1- (0.122074,0) [-4000.12|4000] "Nm" uMusycs
SG_ Md_HR : 48|16@1- (0.122074,0) [-4000.12|4000] "Nm" uMusycs*)
1110:
AI1_SG_Md_VL_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[0], Messages[i].rxData[1]) ;
AI1_SG_Md_VR_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[2], Messages[i].rxData[3]) ;
AI1_SG_Md_HL_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
AI1_SG_Md_HR_RAW:=FB_SB_2ByteToInt(Messages[i].rxData[6], Messages[i].rxData[7]) ;
WD_Message_Md_Ct:=0;
387: (*FU-Drehzahlen*)
FU1_SG_U1_bestromt:=Messages[i].rxData[0].1;
FU1_SG_U1_nMot:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
WD_Message_FU1_Ct:=0;
388: (*FU-Drehzahlen*)
FU2_SG_U1_bestromt:=Messages[i].rxData[0].1;
FU2_SG_U2_nMot:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
WD_Message_FU2_Ct:=0;
386: (*FU-Drehzahlen*)
FU3_SG_U3_nMot:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
WD_Message_FU3_Ct:=0;
385: (*FU-Drehzahlen*)
FU4_SG_U4_nMot:=FB_SB_2ByteToInt(Messages[i].rxData[4], Messages[i].rxData[5]) ;
WD_Message_FU4_Ct:=0;
513: (*Überwachung ob vom Atlantis-System Telegramme gesendet werden*)
WD_Message_Atlantis1_Ct:=0;
514
*Überwachung ob vom Atlantis-System Telegramme gesendet werden*)
WD_Message_Atlantis2_Ct:=0;
515
*Überwachung ob vom Atlantis-System Telegramme gesendet werden*)
WD_Message_Atlantis3_Ct:=0;
516
*Überwachung ob vom Atlantis-System Telegramme gesendet werden*)
WD_Message_Atlantis4_Ct:=0;
(**)
END_CASE
END_FOR
(*Watchdog-Zähler läuft mit dem CPU-Takt hoch, wird ein Telegramm empfangen, wird er auf 0 gesetzt (siehe oben)*)
IF Allgemein_bUeberwachungAktiv THEN
WD_Message_Druck_1_Ct:=WD_Message_Druck_1_Ct+1;
WD_Message_Druck2_Ct:=WD_Message_Druck2_Ct+1;
WD_Message_Temp1_Ct:=WD_Message_Temp1_Ct+1;
WD_Message_Temp2_Ct:=WD_Message_Temp2_Ct+1;
WD_Message_Temp3_Ct:=WD_Message_Temp3_Ct+1;
WD_Message_Temp4_Ct:=WD_Message_Temp4_Ct+1;
WD_Message_AI2_Ct:=WD_Message_AI2_Ct+1;
WD_Message_Md_Ct:=WD_Message_Md_Ct+1;
WD_Message_FU1_Ct:=WD_Message_FU1_Ct+1;
WD_Message_FU2_Ct:=WD_Message_FU2_Ct+1;
WD_Message_FU3_Ct:=WD_Message_FU3_Ct+1;
WD_Message_FU4_Ct:=WD_Message_FU4_Ct+1;
WD_Message_Atlantis1_Ct:=WD_Message_Atlantis1_Ct+1;
WD_Message_Atlantis2_Ct:=WD_Message_Atlantis2_Ct+1;
WD_Message_Atlantis3_Ct:=WD_Message_Atlantis3_Ct+1;
WD_Message_Atlantis4_Ct:=WD_Message_Atlantis4_Ct+1;
END_IF
END_IF
(*Zum Suchen nach destimmten Identifieren im CAN-Bus, bedienbar über VISU*)
IF CAN_uiIdentifierSuche <> OLDIdent THEN
CAN_bIdentifierGefunden:=FALSE;
OLDIdent:=CAN_uiIdentifierSuche;
END_IF