1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | FUNCTION_BLOCK DLogg VAR_INPUT udtInput : IoDrvInput; udtConfig : IoDrvConfig; END_VAR VAR_OUTPUT udtOutput : IoDrvOutput; VAR stream : SerialStream; i : LINT; // Temporary variables byByte: BYTE; nRead: UDINT; nWrote: ULINT; // Stateful variables dwState : DWORD; // Number of Data Loggers on this one serial port udiNumDL : UDINT; // sensor data audtSensor : ARRAY [0..1] OF UVRSensorData; audtSolar1 : ARRAY [0..1] OF UVRSolarData; audtSolar2 : ARRAY [0..1] OF UVRSolarData; byChecksum : BYTE; Delay : TON; // Execute the FB only every second // Quicker sampling is not supported by the logger Delay(IN:=TRUE, PT:=T#1S); IF NOT(Delay.Q) THEN RETURN; END_IF Delay(IN:=FALSE); // Start with the state machine CASE dwState OF 0: stream.Open(1, 115200); next(); // Read number of data loggers 1: nWrote := stream.WriteByte(16#81); IF nWrote = 1 THEN next(); END_IF 2: IF stream.Length >= 1 THEN stream.Read(ADR(byByte), 1); CASE byByte OF 16#A8: udiNumDL := 1; 16#D1: udiNumDL := 2; END_CASE // Read Data-Logger Type (also polls for new data) 3: nWrote := stream.WriteByte(16#AB); 4: IF stream.Length >= 1 THEN byByte := stream.ReadByte(); 16#AB: reset(); // no new data 16#80: next(); // UVR1611 16#90: next(); // UVR61-3 // Read sensor data 5: IF stream.Length >= (39 + 16 + 1) * udiNumDL THEN FOR i:=0 TO udiNumDL-1 DO stream.Read(ADR(audtSensor[i]), 39); stream.Read(ADR(audtSolar1[i]), 8); stream.Read(ADR(audtSolar2[i]), 8); byChecksum := stream.ReadByte(); END_FOR // Convert RAW data to temperatures and boolean actor data udtInput.C0_S2 := THIS^.raw2temp(audtSensor[0].auiTemperature[1]); udtInput.C0_S4 := THIS^.raw2temp(audtSensor[0].auiTemperature[3]); udtInput.C0_S6 := THIS^.raw2temp(audtSensor[0].auiTemperature[5]); udtInput.C0_S8 := THIS^.raw2temp(audtSensor[0].auiTemperature[7]); udtInput.C0_S10 := THIS^.raw2temp(audtSensor[0].auiTemperature[9]); udtInput.C0_S12 := THIS^.raw2temp(audtSensor[0].auiTemperature[11]); udtInput.C0_S14 := THIS^.raw2temp(audtSensor[0].auiTemperature[13]); udtInput.C0_S16 := THIS^.raw2temp(audtSensor[0].auiTemperature[15]); udtInput.C1_S2 := THIS^.raw2temp(audtSensor[1].auiTemperature[1]); udtInput.C1_S4 := THIS^.raw2temp(audtSensor[1].auiTemperature[3]); udtInput.C1_S6 := THIS^.raw2temp(audtSensor[1].auiTemperature[5]); udtInput.C1_S8 := THIS^.raw2temp(audtSensor[1].auiTemperature[7]); udtInput.C1_S10 := THIS^.raw2temp(audtSensor[1].auiTemperature[9]); udtInput.C1_S12 := THIS^.raw2temp(audtSensor[1].auiTemperature[11]); udtInput.C1_S14 := THIS^.raw2temp(audtSensor[1].auiTemperature[13]); udtInput.C1_S16 := THIS^.raw2analog(audtSensor[1].auiTemperature[15]); udtInput.C0_A0 := audtSensor[0].abyDOUT[0]; udtInput.C0_A1 := audtSensor[0].abyDOUT[1]; udtInput.C1_A0 := audtSensor[1].abyDOUT[0]; udtInput.C1_A1 := audtSensor[1].abyDOUT[1]; // End 7: reset(); END_CASE |