From bbcc54ca8a89de7c422d6197cb52e682857b9cdd Mon Sep 17 00:00:00 2001 From: Lukas Kytka Date: Thu, 6 Jul 2023 10:11:11 +0200 Subject: [PATCH 01/32] wip --- Export/PLC_1/CopyInputs.st | 223 ++++++ Export/PLC_1/CopyOutputs.st | 210 +++++ Export/PLC_1/HwInputs.st | 15 + Export/PLC_1/HwOutputs.st | 14 + Export/PLC_1/PlcInputs.st | 15 + Export/PLC_1/PlcOutputs.st | 14 + ..._COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION | 8 + .../_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM | 12 + close | 750 ++++++++++++++++++ .../axosimple.app/Pages/UI/Io.razor | 7 +- src/templates.simple/axosimple.twin/Entry.cs | 2 +- .../Resources/PlcStringResources.resx | 6 +- src/templates.simple/ctrl/Reader.mon | 5 + src/templates.simple/ctrl/apax.yml | 5 +- src/templates.simple/ctrl/monitor.mon | 9 +- src/templates.simple/ctrl/snippets/lukas.json | 20 + .../ctrl/src/Components/CgnReader.st | 332 ++++++++ src/templates.simple/ctrl/src/Context.st | 6 +- .../ctrl/src/Examples/PneumaticManipulator.st | 28 +- .../ctrl/src/IO/CopyInputs.st | 223 ++++++ .../ctrl/src/IO/CopyOutputs.st | 210 +++++ src/templates.simple/ctrl/src/IO/HwInputs.st | 15 + src/templates.simple/ctrl/src/IO/HwOutputs.st | 14 + src/templates.simple/ctrl/src/IO/PlcInputs.st | 15 + .../ctrl/src/IO/PlcOutputs.st | 14 + .../ctrl/src/configuration.st | 10 + src/templates.simple/ctrl/src/program.st | 22 +- 27 files changed, 2186 insertions(+), 18 deletions(-) create mode 100644 Export/PLC_1/CopyInputs.st create mode 100644 Export/PLC_1/CopyOutputs.st create mode 100644 Export/PLC_1/HwInputs.st create mode 100644 Export/PLC_1/HwOutputs.st create mode 100644 Export/PLC_1/PlcInputs.st create mode 100644 Export/PLC_1/PlcOutputs.st create mode 100644 Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION create mode 100644 Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM create mode 100644 close create mode 100644 src/templates.simple/ctrl/Reader.mon create mode 100644 src/templates.simple/ctrl/snippets/lukas.json create mode 100644 src/templates.simple/ctrl/src/Components/CgnReader.st create mode 100644 src/templates.simple/ctrl/src/IO/CopyInputs.st create mode 100644 src/templates.simple/ctrl/src/IO/CopyOutputs.st create mode 100644 src/templates.simple/ctrl/src/IO/HwInputs.st create mode 100644 src/templates.simple/ctrl/src/IO/HwOutputs.st create mode 100644 src/templates.simple/ctrl/src/IO/PlcInputs.st create mode 100644 src/templates.simple/ctrl/src/IO/PlcOutputs.st diff --git a/Export/PLC_1/CopyInputs.st b/Export/PLC_1/CopyInputs.st new file mode 100644 index 000000000..a1690b2c6 --- /dev/null +++ b/Export/PLC_1/CopyInputs.st @@ -0,0 +1,223 @@ +FUNCTION CopyInputs + VAR_EXTERNAL + HwInputs : HwInputs; + PlcInputs : PlcInputs; + END_VAR + PlcInputs._11a1_DI_8x24VDC_ST_1 := HwInputs._11a1_DI_8x24VDC_ST_1; + PlcInputs._11a1_DI_8x24VDC_ST_2 := HwInputs._11a1_DI_8x24VDC_ST_2; + PlcInputs._12a1_Acquisition_Status_1[0] := HwInputs._12a1_Acquisition_Status_1[0]; + PlcInputs._12a1_Acquisition_Status_1[1] := HwInputs._12a1_Acquisition_Status_1[1]; + PlcInputs._12a1_Acquisition_Status_1[2] := HwInputs._12a1_Acquisition_Status_1[2]; + PlcInputs._12a1_Inspection_Status_1 := HwInputs._12a1_Inspection_Status_1; + PlcInputs._12a1_Command_Control_1 := HwInputs._12a1_Command_Control_1; + PlcInputs._12a1_SoftEvent_Control_1 := HwInputs._12a1_SoftEvent_Control_1; + PlcInputs._12a1_Results_64_bytes_1[0] := HwInputs._12a1_Results_64_bytes_1[0]; + PlcInputs._12a1_Results_64_bytes_1[1] := HwInputs._12a1_Results_64_bytes_1[1]; + PlcInputs._12a1_Results_64_bytes_1[2] := HwInputs._12a1_Results_64_bytes_1[2]; + PlcInputs._12a1_Results_64_bytes_1[3] := HwInputs._12a1_Results_64_bytes_1[3]; + PlcInputs._12a1_Results_64_bytes_1[4] := HwInputs._12a1_Results_64_bytes_1[4]; + PlcInputs._12a1_Results_64_bytes_1[5] := HwInputs._12a1_Results_64_bytes_1[5]; + PlcInputs._12a1_Results_64_bytes_1[6] := HwInputs._12a1_Results_64_bytes_1[6]; + PlcInputs._12a1_Results_64_bytes_1[7] := HwInputs._12a1_Results_64_bytes_1[7]; + PlcInputs._12a1_Results_64_bytes_1[8] := HwInputs._12a1_Results_64_bytes_1[8]; + PlcInputs._12a1_Results_64_bytes_1[9] := HwInputs._12a1_Results_64_bytes_1[9]; + PlcInputs._12a1_Results_64_bytes_1[10] := HwInputs._12a1_Results_64_bytes_1[10]; + PlcInputs._12a1_Results_64_bytes_1[11] := HwInputs._12a1_Results_64_bytes_1[11]; + PlcInputs._12a1_Results_64_bytes_1[12] := HwInputs._12a1_Results_64_bytes_1[12]; + PlcInputs._12a1_Results_64_bytes_1[13] := HwInputs._12a1_Results_64_bytes_1[13]; + PlcInputs._12a1_Results_64_bytes_1[14] := HwInputs._12a1_Results_64_bytes_1[14]; + PlcInputs._12a1_Results_64_bytes_1[15] := HwInputs._12a1_Results_64_bytes_1[15]; + PlcInputs._12a1_Results_64_bytes_1[16] := HwInputs._12a1_Results_64_bytes_1[16]; + PlcInputs._12a1_Results_64_bytes_1[17] := HwInputs._12a1_Results_64_bytes_1[17]; + PlcInputs._12a1_Results_64_bytes_1[18] := HwInputs._12a1_Results_64_bytes_1[18]; + PlcInputs._12a1_Results_64_bytes_1[19] := HwInputs._12a1_Results_64_bytes_1[19]; + PlcInputs._12a1_Results_64_bytes_1[20] := HwInputs._12a1_Results_64_bytes_1[20]; + PlcInputs._12a1_Results_64_bytes_1[21] := HwInputs._12a1_Results_64_bytes_1[21]; + PlcInputs._12a1_Results_64_bytes_1[22] := HwInputs._12a1_Results_64_bytes_1[22]; + PlcInputs._12a1_Results_64_bytes_1[23] := HwInputs._12a1_Results_64_bytes_1[23]; + PlcInputs._12a1_Results_64_bytes_1[24] := HwInputs._12a1_Results_64_bytes_1[24]; + PlcInputs._12a1_Results_64_bytes_1[25] := HwInputs._12a1_Results_64_bytes_1[25]; + PlcInputs._12a1_Results_64_bytes_1[26] := HwInputs._12a1_Results_64_bytes_1[26]; + PlcInputs._12a1_Results_64_bytes_1[27] := HwInputs._12a1_Results_64_bytes_1[27]; + PlcInputs._12a1_Results_64_bytes_1[28] := HwInputs._12a1_Results_64_bytes_1[28]; + PlcInputs._12a1_Results_64_bytes_1[29] := HwInputs._12a1_Results_64_bytes_1[29]; + PlcInputs._12a1_Results_64_bytes_1[30] := HwInputs._12a1_Results_64_bytes_1[30]; + PlcInputs._12a1_Results_64_bytes_1[31] := HwInputs._12a1_Results_64_bytes_1[31]; + PlcInputs._12a1_Results_64_bytes_1[32] := HwInputs._12a1_Results_64_bytes_1[32]; + PlcInputs._12a1_Results_64_bytes_1[33] := HwInputs._12a1_Results_64_bytes_1[33]; + PlcInputs._12a1_Results_64_bytes_1[34] := HwInputs._12a1_Results_64_bytes_1[34]; + PlcInputs._12a1_Results_64_bytes_1[35] := HwInputs._12a1_Results_64_bytes_1[35]; + PlcInputs._12a1_Results_64_bytes_1[36] := HwInputs._12a1_Results_64_bytes_1[36]; + PlcInputs._12a1_Results_64_bytes_1[37] := HwInputs._12a1_Results_64_bytes_1[37]; + PlcInputs._12a1_Results_64_bytes_1[38] := HwInputs._12a1_Results_64_bytes_1[38]; + PlcInputs._12a1_Results_64_bytes_1[39] := HwInputs._12a1_Results_64_bytes_1[39]; + PlcInputs._12a1_Results_64_bytes_1[40] := HwInputs._12a1_Results_64_bytes_1[40]; + PlcInputs._12a1_Results_64_bytes_1[41] := HwInputs._12a1_Results_64_bytes_1[41]; + PlcInputs._12a1_Results_64_bytes_1[42] := HwInputs._12a1_Results_64_bytes_1[42]; + PlcInputs._12a1_Results_64_bytes_1[43] := HwInputs._12a1_Results_64_bytes_1[43]; + PlcInputs._12a1_Results_64_bytes_1[44] := HwInputs._12a1_Results_64_bytes_1[44]; + PlcInputs._12a1_Results_64_bytes_1[45] := HwInputs._12a1_Results_64_bytes_1[45]; + PlcInputs._12a1_Results_64_bytes_1[46] := HwInputs._12a1_Results_64_bytes_1[46]; + PlcInputs._12a1_Results_64_bytes_1[47] := HwInputs._12a1_Results_64_bytes_1[47]; + PlcInputs._12a1_Results_64_bytes_1[48] := HwInputs._12a1_Results_64_bytes_1[48]; + PlcInputs._12a1_Results_64_bytes_1[49] := HwInputs._12a1_Results_64_bytes_1[49]; + PlcInputs._12a1_Results_64_bytes_1[50] := HwInputs._12a1_Results_64_bytes_1[50]; + PlcInputs._12a1_Results_64_bytes_1[51] := HwInputs._12a1_Results_64_bytes_1[51]; + PlcInputs._12a1_Results_64_bytes_1[52] := HwInputs._12a1_Results_64_bytes_1[52]; + PlcInputs._12a1_Results_64_bytes_1[53] := HwInputs._12a1_Results_64_bytes_1[53]; + PlcInputs._12a1_Results_64_bytes_1[54] := HwInputs._12a1_Results_64_bytes_1[54]; + PlcInputs._12a1_Results_64_bytes_1[55] := HwInputs._12a1_Results_64_bytes_1[55]; + PlcInputs._12a1_Results_64_bytes_1[56] := HwInputs._12a1_Results_64_bytes_1[56]; + PlcInputs._12a1_Results_64_bytes_1[57] := HwInputs._12a1_Results_64_bytes_1[57]; + PlcInputs._12a1_Results_64_bytes_1[58] := HwInputs._12a1_Results_64_bytes_1[58]; + PlcInputs._12a1_Results_64_bytes_1[59] := HwInputs._12a1_Results_64_bytes_1[59]; + PlcInputs._12a1_Results_64_bytes_1[60] := HwInputs._12a1_Results_64_bytes_1[60]; + PlcInputs._12a1_Results_64_bytes_1[61] := HwInputs._12a1_Results_64_bytes_1[61]; + PlcInputs._12a1_Results_64_bytes_1[62] := HwInputs._12a1_Results_64_bytes_1[62]; + PlcInputs._12a1_Results_64_bytes_1[63] := HwInputs._12a1_Results_64_bytes_1[63]; + PlcInputs._12a1_Results_64_bytes_1[64] := HwInputs._12a1_Results_64_bytes_1[64]; + PlcInputs._12a1_Results_64_bytes_1[65] := HwInputs._12a1_Results_64_bytes_1[65]; + PlcInputs._12a1_Results_64_bytes_1[66] := HwInputs._12a1_Results_64_bytes_1[66]; + PlcInputs._12a1_Results_64_bytes_1[67] := HwInputs._12a1_Results_64_bytes_1[67]; + PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; + PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; + PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; + PlcInputs._10a1_Results_Status_1 := HwInputs._10a1_Results_Status_1; + PlcInputs._10a1_Soft_Event_Control_1 := HwInputs._10a1_Soft_Event_Control_1; + PlcInputs._10a1_Result_Data_128_bytes_1[0] := HwInputs._10a1_Result_Data_128_bytes_1[0]; + PlcInputs._10a1_Result_Data_128_bytes_1[1] := HwInputs._10a1_Result_Data_128_bytes_1[1]; + PlcInputs._10a1_Result_Data_128_bytes_1[2] := HwInputs._10a1_Result_Data_128_bytes_1[2]; + PlcInputs._10a1_Result_Data_128_bytes_1[3] := HwInputs._10a1_Result_Data_128_bytes_1[3]; + PlcInputs._10a1_Result_Data_128_bytes_1[4] := HwInputs._10a1_Result_Data_128_bytes_1[4]; + PlcInputs._10a1_Result_Data_128_bytes_1[5] := HwInputs._10a1_Result_Data_128_bytes_1[5]; + PlcInputs._10a1_Result_Data_128_bytes_1[6] := HwInputs._10a1_Result_Data_128_bytes_1[6]; + PlcInputs._10a1_Result_Data_128_bytes_1[7] := HwInputs._10a1_Result_Data_128_bytes_1[7]; + PlcInputs._10a1_Result_Data_128_bytes_1[8] := HwInputs._10a1_Result_Data_128_bytes_1[8]; + PlcInputs._10a1_Result_Data_128_bytes_1[9] := HwInputs._10a1_Result_Data_128_bytes_1[9]; + PlcInputs._10a1_Result_Data_128_bytes_1[10] := HwInputs._10a1_Result_Data_128_bytes_1[10]; + PlcInputs._10a1_Result_Data_128_bytes_1[11] := HwInputs._10a1_Result_Data_128_bytes_1[11]; + PlcInputs._10a1_Result_Data_128_bytes_1[12] := HwInputs._10a1_Result_Data_128_bytes_1[12]; + PlcInputs._10a1_Result_Data_128_bytes_1[13] := HwInputs._10a1_Result_Data_128_bytes_1[13]; + PlcInputs._10a1_Result_Data_128_bytes_1[14] := HwInputs._10a1_Result_Data_128_bytes_1[14]; + PlcInputs._10a1_Result_Data_128_bytes_1[15] := HwInputs._10a1_Result_Data_128_bytes_1[15]; + PlcInputs._10a1_Result_Data_128_bytes_1[16] := HwInputs._10a1_Result_Data_128_bytes_1[16]; + PlcInputs._10a1_Result_Data_128_bytes_1[17] := HwInputs._10a1_Result_Data_128_bytes_1[17]; + PlcInputs._10a1_Result_Data_128_bytes_1[18] := HwInputs._10a1_Result_Data_128_bytes_1[18]; + PlcInputs._10a1_Result_Data_128_bytes_1[19] := HwInputs._10a1_Result_Data_128_bytes_1[19]; + PlcInputs._10a1_Result_Data_128_bytes_1[20] := HwInputs._10a1_Result_Data_128_bytes_1[20]; + PlcInputs._10a1_Result_Data_128_bytes_1[21] := HwInputs._10a1_Result_Data_128_bytes_1[21]; + PlcInputs._10a1_Result_Data_128_bytes_1[22] := HwInputs._10a1_Result_Data_128_bytes_1[22]; + PlcInputs._10a1_Result_Data_128_bytes_1[23] := HwInputs._10a1_Result_Data_128_bytes_1[23]; + PlcInputs._10a1_Result_Data_128_bytes_1[24] := HwInputs._10a1_Result_Data_128_bytes_1[24]; + PlcInputs._10a1_Result_Data_128_bytes_1[25] := HwInputs._10a1_Result_Data_128_bytes_1[25]; + PlcInputs._10a1_Result_Data_128_bytes_1[26] := HwInputs._10a1_Result_Data_128_bytes_1[26]; + PlcInputs._10a1_Result_Data_128_bytes_1[27] := HwInputs._10a1_Result_Data_128_bytes_1[27]; + PlcInputs._10a1_Result_Data_128_bytes_1[28] := HwInputs._10a1_Result_Data_128_bytes_1[28]; + PlcInputs._10a1_Result_Data_128_bytes_1[29] := HwInputs._10a1_Result_Data_128_bytes_1[29]; + PlcInputs._10a1_Result_Data_128_bytes_1[30] := HwInputs._10a1_Result_Data_128_bytes_1[30]; + PlcInputs._10a1_Result_Data_128_bytes_1[31] := HwInputs._10a1_Result_Data_128_bytes_1[31]; + PlcInputs._10a1_Result_Data_128_bytes_1[32] := HwInputs._10a1_Result_Data_128_bytes_1[32]; + PlcInputs._10a1_Result_Data_128_bytes_1[33] := HwInputs._10a1_Result_Data_128_bytes_1[33]; + PlcInputs._10a1_Result_Data_128_bytes_1[34] := HwInputs._10a1_Result_Data_128_bytes_1[34]; + PlcInputs._10a1_Result_Data_128_bytes_1[35] := HwInputs._10a1_Result_Data_128_bytes_1[35]; + PlcInputs._10a1_Result_Data_128_bytes_1[36] := HwInputs._10a1_Result_Data_128_bytes_1[36]; + PlcInputs._10a1_Result_Data_128_bytes_1[37] := HwInputs._10a1_Result_Data_128_bytes_1[37]; + PlcInputs._10a1_Result_Data_128_bytes_1[38] := HwInputs._10a1_Result_Data_128_bytes_1[38]; + PlcInputs._10a1_Result_Data_128_bytes_1[39] := HwInputs._10a1_Result_Data_128_bytes_1[39]; + PlcInputs._10a1_Result_Data_128_bytes_1[40] := HwInputs._10a1_Result_Data_128_bytes_1[40]; + PlcInputs._10a1_Result_Data_128_bytes_1[41] := HwInputs._10a1_Result_Data_128_bytes_1[41]; + PlcInputs._10a1_Result_Data_128_bytes_1[42] := HwInputs._10a1_Result_Data_128_bytes_1[42]; + PlcInputs._10a1_Result_Data_128_bytes_1[43] := HwInputs._10a1_Result_Data_128_bytes_1[43]; + PlcInputs._10a1_Result_Data_128_bytes_1[44] := HwInputs._10a1_Result_Data_128_bytes_1[44]; + PlcInputs._10a1_Result_Data_128_bytes_1[45] := HwInputs._10a1_Result_Data_128_bytes_1[45]; + PlcInputs._10a1_Result_Data_128_bytes_1[46] := HwInputs._10a1_Result_Data_128_bytes_1[46]; + PlcInputs._10a1_Result_Data_128_bytes_1[47] := HwInputs._10a1_Result_Data_128_bytes_1[47]; + PlcInputs._10a1_Result_Data_128_bytes_1[48] := HwInputs._10a1_Result_Data_128_bytes_1[48]; + PlcInputs._10a1_Result_Data_128_bytes_1[49] := HwInputs._10a1_Result_Data_128_bytes_1[49]; + PlcInputs._10a1_Result_Data_128_bytes_1[50] := HwInputs._10a1_Result_Data_128_bytes_1[50]; + PlcInputs._10a1_Result_Data_128_bytes_1[51] := HwInputs._10a1_Result_Data_128_bytes_1[51]; + PlcInputs._10a1_Result_Data_128_bytes_1[52] := HwInputs._10a1_Result_Data_128_bytes_1[52]; + PlcInputs._10a1_Result_Data_128_bytes_1[53] := HwInputs._10a1_Result_Data_128_bytes_1[53]; + PlcInputs._10a1_Result_Data_128_bytes_1[54] := HwInputs._10a1_Result_Data_128_bytes_1[54]; + PlcInputs._10a1_Result_Data_128_bytes_1[55] := HwInputs._10a1_Result_Data_128_bytes_1[55]; + PlcInputs._10a1_Result_Data_128_bytes_1[56] := HwInputs._10a1_Result_Data_128_bytes_1[56]; + PlcInputs._10a1_Result_Data_128_bytes_1[57] := HwInputs._10a1_Result_Data_128_bytes_1[57]; + PlcInputs._10a1_Result_Data_128_bytes_1[58] := HwInputs._10a1_Result_Data_128_bytes_1[58]; + PlcInputs._10a1_Result_Data_128_bytes_1[59] := HwInputs._10a1_Result_Data_128_bytes_1[59]; + PlcInputs._10a1_Result_Data_128_bytes_1[60] := HwInputs._10a1_Result_Data_128_bytes_1[60]; + PlcInputs._10a1_Result_Data_128_bytes_1[61] := HwInputs._10a1_Result_Data_128_bytes_1[61]; + PlcInputs._10a1_Result_Data_128_bytes_1[62] := HwInputs._10a1_Result_Data_128_bytes_1[62]; + PlcInputs._10a1_Result_Data_128_bytes_1[63] := HwInputs._10a1_Result_Data_128_bytes_1[63]; + PlcInputs._10a1_Result_Data_128_bytes_1[64] := HwInputs._10a1_Result_Data_128_bytes_1[64]; + PlcInputs._10a1_Result_Data_128_bytes_1[65] := HwInputs._10a1_Result_Data_128_bytes_1[65]; + PlcInputs._10a1_Result_Data_128_bytes_1[66] := HwInputs._10a1_Result_Data_128_bytes_1[66]; + PlcInputs._10a1_Result_Data_128_bytes_1[67] := HwInputs._10a1_Result_Data_128_bytes_1[67]; + PlcInputs._10a1_Result_Data_128_bytes_1[68] := HwInputs._10a1_Result_Data_128_bytes_1[68]; + PlcInputs._10a1_Result_Data_128_bytes_1[69] := HwInputs._10a1_Result_Data_128_bytes_1[69]; + PlcInputs._10a1_Result_Data_128_bytes_1[70] := HwInputs._10a1_Result_Data_128_bytes_1[70]; + PlcInputs._10a1_Result_Data_128_bytes_1[71] := HwInputs._10a1_Result_Data_128_bytes_1[71]; + PlcInputs._10a1_Result_Data_128_bytes_1[72] := HwInputs._10a1_Result_Data_128_bytes_1[72]; + PlcInputs._10a1_Result_Data_128_bytes_1[73] := HwInputs._10a1_Result_Data_128_bytes_1[73]; + PlcInputs._10a1_Result_Data_128_bytes_1[74] := HwInputs._10a1_Result_Data_128_bytes_1[74]; + PlcInputs._10a1_Result_Data_128_bytes_1[75] := HwInputs._10a1_Result_Data_128_bytes_1[75]; + PlcInputs._10a1_Result_Data_128_bytes_1[76] := HwInputs._10a1_Result_Data_128_bytes_1[76]; + PlcInputs._10a1_Result_Data_128_bytes_1[77] := HwInputs._10a1_Result_Data_128_bytes_1[77]; + PlcInputs._10a1_Result_Data_128_bytes_1[78] := HwInputs._10a1_Result_Data_128_bytes_1[78]; + PlcInputs._10a1_Result_Data_128_bytes_1[79] := HwInputs._10a1_Result_Data_128_bytes_1[79]; + PlcInputs._10a1_Result_Data_128_bytes_1[80] := HwInputs._10a1_Result_Data_128_bytes_1[80]; + PlcInputs._10a1_Result_Data_128_bytes_1[81] := HwInputs._10a1_Result_Data_128_bytes_1[81]; + PlcInputs._10a1_Result_Data_128_bytes_1[82] := HwInputs._10a1_Result_Data_128_bytes_1[82]; + PlcInputs._10a1_Result_Data_128_bytes_1[83] := HwInputs._10a1_Result_Data_128_bytes_1[83]; + PlcInputs._10a1_Result_Data_128_bytes_1[84] := HwInputs._10a1_Result_Data_128_bytes_1[84]; + PlcInputs._10a1_Result_Data_128_bytes_1[85] := HwInputs._10a1_Result_Data_128_bytes_1[85]; + PlcInputs._10a1_Result_Data_128_bytes_1[86] := HwInputs._10a1_Result_Data_128_bytes_1[86]; + PlcInputs._10a1_Result_Data_128_bytes_1[87] := HwInputs._10a1_Result_Data_128_bytes_1[87]; + PlcInputs._10a1_Result_Data_128_bytes_1[88] := HwInputs._10a1_Result_Data_128_bytes_1[88]; + PlcInputs._10a1_Result_Data_128_bytes_1[89] := HwInputs._10a1_Result_Data_128_bytes_1[89]; + PlcInputs._10a1_Result_Data_128_bytes_1[90] := HwInputs._10a1_Result_Data_128_bytes_1[90]; + PlcInputs._10a1_Result_Data_128_bytes_1[91] := HwInputs._10a1_Result_Data_128_bytes_1[91]; + PlcInputs._10a1_Result_Data_128_bytes_1[92] := HwInputs._10a1_Result_Data_128_bytes_1[92]; + PlcInputs._10a1_Result_Data_128_bytes_1[93] := HwInputs._10a1_Result_Data_128_bytes_1[93]; + PlcInputs._10a1_Result_Data_128_bytes_1[94] := HwInputs._10a1_Result_Data_128_bytes_1[94]; + PlcInputs._10a1_Result_Data_128_bytes_1[95] := HwInputs._10a1_Result_Data_128_bytes_1[95]; + PlcInputs._10a1_Result_Data_128_bytes_1[96] := HwInputs._10a1_Result_Data_128_bytes_1[96]; + PlcInputs._10a1_Result_Data_128_bytes_1[97] := HwInputs._10a1_Result_Data_128_bytes_1[97]; + PlcInputs._10a1_Result_Data_128_bytes_1[98] := HwInputs._10a1_Result_Data_128_bytes_1[98]; + PlcInputs._10a1_Result_Data_128_bytes_1[99] := HwInputs._10a1_Result_Data_128_bytes_1[99]; + PlcInputs._10a1_Result_Data_128_bytes_1[100] := HwInputs._10a1_Result_Data_128_bytes_1[100]; + PlcInputs._10a1_Result_Data_128_bytes_1[101] := HwInputs._10a1_Result_Data_128_bytes_1[101]; + PlcInputs._10a1_Result_Data_128_bytes_1[102] := HwInputs._10a1_Result_Data_128_bytes_1[102]; + PlcInputs._10a1_Result_Data_128_bytes_1[103] := HwInputs._10a1_Result_Data_128_bytes_1[103]; + PlcInputs._10a1_Result_Data_128_bytes_1[104] := HwInputs._10a1_Result_Data_128_bytes_1[104]; + PlcInputs._10a1_Result_Data_128_bytes_1[105] := HwInputs._10a1_Result_Data_128_bytes_1[105]; + PlcInputs._10a1_Result_Data_128_bytes_1[106] := HwInputs._10a1_Result_Data_128_bytes_1[106]; + PlcInputs._10a1_Result_Data_128_bytes_1[107] := HwInputs._10a1_Result_Data_128_bytes_1[107]; + PlcInputs._10a1_Result_Data_128_bytes_1[108] := HwInputs._10a1_Result_Data_128_bytes_1[108]; + PlcInputs._10a1_Result_Data_128_bytes_1[109] := HwInputs._10a1_Result_Data_128_bytes_1[109]; + PlcInputs._10a1_Result_Data_128_bytes_1[110] := HwInputs._10a1_Result_Data_128_bytes_1[110]; + PlcInputs._10a1_Result_Data_128_bytes_1[111] := HwInputs._10a1_Result_Data_128_bytes_1[111]; + PlcInputs._10a1_Result_Data_128_bytes_1[112] := HwInputs._10a1_Result_Data_128_bytes_1[112]; + PlcInputs._10a1_Result_Data_128_bytes_1[113] := HwInputs._10a1_Result_Data_128_bytes_1[113]; + PlcInputs._10a1_Result_Data_128_bytes_1[114] := HwInputs._10a1_Result_Data_128_bytes_1[114]; + PlcInputs._10a1_Result_Data_128_bytes_1[115] := HwInputs._10a1_Result_Data_128_bytes_1[115]; + PlcInputs._10a1_Result_Data_128_bytes_1[116] := HwInputs._10a1_Result_Data_128_bytes_1[116]; + PlcInputs._10a1_Result_Data_128_bytes_1[117] := HwInputs._10a1_Result_Data_128_bytes_1[117]; + PlcInputs._10a1_Result_Data_128_bytes_1[118] := HwInputs._10a1_Result_Data_128_bytes_1[118]; + PlcInputs._10a1_Result_Data_128_bytes_1[119] := HwInputs._10a1_Result_Data_128_bytes_1[119]; + PlcInputs._10a1_Result_Data_128_bytes_1[120] := HwInputs._10a1_Result_Data_128_bytes_1[120]; + PlcInputs._10a1_Result_Data_128_bytes_1[121] := HwInputs._10a1_Result_Data_128_bytes_1[121]; + PlcInputs._10a1_Result_Data_128_bytes_1[122] := HwInputs._10a1_Result_Data_128_bytes_1[122]; + PlcInputs._10a1_Result_Data_128_bytes_1[123] := HwInputs._10a1_Result_Data_128_bytes_1[123]; + PlcInputs._10a1_Result_Data_128_bytes_1[124] := HwInputs._10a1_Result_Data_128_bytes_1[124]; + PlcInputs._10a1_Result_Data_128_bytes_1[125] := HwInputs._10a1_Result_Data_128_bytes_1[125]; + PlcInputs._10a1_Result_Data_128_bytes_1[126] := HwInputs._10a1_Result_Data_128_bytes_1[126]; + PlcInputs._10a1_Result_Data_128_bytes_1[127] := HwInputs._10a1_Result_Data_128_bytes_1[127]; + PlcInputs._10a1_Result_Data_128_bytes_1[128] := HwInputs._10a1_Result_Data_128_bytes_1[128]; + PlcInputs._10a1_Result_Data_128_bytes_1[129] := HwInputs._10a1_Result_Data_128_bytes_1[129]; + PlcInputs._10a1_Result_Data_128_bytes_1[130] := HwInputs._10a1_Result_Data_128_bytes_1[130]; + PlcInputs._10a1_Result_Data_128_bytes_1[131] := HwInputs._10a1_Result_Data_128_bytes_1[131]; + PlcInputs._10a1_Result_Data_128_bytes_1[132] := HwInputs._10a1_Result_Data_128_bytes_1[132]; + PlcInputs._10a1_Result_Data_128_bytes_1[133] := HwInputs._10a1_Result_Data_128_bytes_1[133]; + PlcInputs._10a1_Result_Data_128_bytes_1[134] := HwInputs._10a1_Result_Data_128_bytes_1[134]; + PlcInputs._10a1_Result_Data_128_bytes_1[135] := HwInputs._10a1_Result_Data_128_bytes_1[135]; +END_FUNCTION diff --git a/Export/PLC_1/CopyOutputs.st b/Export/PLC_1/CopyOutputs.st new file mode 100644 index 000000000..caf897994 --- /dev/null +++ b/Export/PLC_1/CopyOutputs.st @@ -0,0 +1,210 @@ +FUNCTION CopyOutputs + VAR_EXTERNAL + HwOutputs : HwOutputs; + PlcOutputs : PlcOutputs; + END_VAR + HwOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1; + HwOutputs._12a1_Acquisition_Control_1 := PlcOutputs._12a1_Acquisition_Control_1; + HwOutputs._12a1_Inspection_Control_1 := PlcOutputs._12a1_Inspection_Control_1; + HwOutputs._12a1_Command_Control_1 := PlcOutputs._12a1_Command_Control_1; + HwOutputs._12a1_SoftEvent_Control_1 := PlcOutputs._12a1_SoftEvent_Control_1; + HwOutputs._12a1_User_Data_64_bytes_1[0] := PlcOutputs._12a1_User_Data_64_bytes_1[0]; + HwOutputs._12a1_User_Data_64_bytes_1[1] := PlcOutputs._12a1_User_Data_64_bytes_1[1]; + HwOutputs._12a1_User_Data_64_bytes_1[2] := PlcOutputs._12a1_User_Data_64_bytes_1[2]; + HwOutputs._12a1_User_Data_64_bytes_1[3] := PlcOutputs._12a1_User_Data_64_bytes_1[3]; + HwOutputs._12a1_User_Data_64_bytes_1[4] := PlcOutputs._12a1_User_Data_64_bytes_1[4]; + HwOutputs._12a1_User_Data_64_bytes_1[5] := PlcOutputs._12a1_User_Data_64_bytes_1[5]; + HwOutputs._12a1_User_Data_64_bytes_1[6] := PlcOutputs._12a1_User_Data_64_bytes_1[6]; + HwOutputs._12a1_User_Data_64_bytes_1[7] := PlcOutputs._12a1_User_Data_64_bytes_1[7]; + HwOutputs._12a1_User_Data_64_bytes_1[8] := PlcOutputs._12a1_User_Data_64_bytes_1[8]; + HwOutputs._12a1_User_Data_64_bytes_1[9] := PlcOutputs._12a1_User_Data_64_bytes_1[9]; + HwOutputs._12a1_User_Data_64_bytes_1[10] := PlcOutputs._12a1_User_Data_64_bytes_1[10]; + HwOutputs._12a1_User_Data_64_bytes_1[11] := PlcOutputs._12a1_User_Data_64_bytes_1[11]; + HwOutputs._12a1_User_Data_64_bytes_1[12] := PlcOutputs._12a1_User_Data_64_bytes_1[12]; + HwOutputs._12a1_User_Data_64_bytes_1[13] := PlcOutputs._12a1_User_Data_64_bytes_1[13]; + HwOutputs._12a1_User_Data_64_bytes_1[14] := PlcOutputs._12a1_User_Data_64_bytes_1[14]; + HwOutputs._12a1_User_Data_64_bytes_1[15] := PlcOutputs._12a1_User_Data_64_bytes_1[15]; + HwOutputs._12a1_User_Data_64_bytes_1[16] := PlcOutputs._12a1_User_Data_64_bytes_1[16]; + HwOutputs._12a1_User_Data_64_bytes_1[17] := PlcOutputs._12a1_User_Data_64_bytes_1[17]; + HwOutputs._12a1_User_Data_64_bytes_1[18] := PlcOutputs._12a1_User_Data_64_bytes_1[18]; + HwOutputs._12a1_User_Data_64_bytes_1[19] := PlcOutputs._12a1_User_Data_64_bytes_1[19]; + HwOutputs._12a1_User_Data_64_bytes_1[20] := PlcOutputs._12a1_User_Data_64_bytes_1[20]; + HwOutputs._12a1_User_Data_64_bytes_1[21] := PlcOutputs._12a1_User_Data_64_bytes_1[21]; + HwOutputs._12a1_User_Data_64_bytes_1[22] := PlcOutputs._12a1_User_Data_64_bytes_1[22]; + HwOutputs._12a1_User_Data_64_bytes_1[23] := PlcOutputs._12a1_User_Data_64_bytes_1[23]; + HwOutputs._12a1_User_Data_64_bytes_1[24] := PlcOutputs._12a1_User_Data_64_bytes_1[24]; + HwOutputs._12a1_User_Data_64_bytes_1[25] := PlcOutputs._12a1_User_Data_64_bytes_1[25]; + HwOutputs._12a1_User_Data_64_bytes_1[26] := PlcOutputs._12a1_User_Data_64_bytes_1[26]; + HwOutputs._12a1_User_Data_64_bytes_1[27] := PlcOutputs._12a1_User_Data_64_bytes_1[27]; + HwOutputs._12a1_User_Data_64_bytes_1[28] := PlcOutputs._12a1_User_Data_64_bytes_1[28]; + HwOutputs._12a1_User_Data_64_bytes_1[29] := PlcOutputs._12a1_User_Data_64_bytes_1[29]; + HwOutputs._12a1_User_Data_64_bytes_1[30] := PlcOutputs._12a1_User_Data_64_bytes_1[30]; + HwOutputs._12a1_User_Data_64_bytes_1[31] := PlcOutputs._12a1_User_Data_64_bytes_1[31]; + HwOutputs._12a1_User_Data_64_bytes_1[32] := PlcOutputs._12a1_User_Data_64_bytes_1[32]; + HwOutputs._12a1_User_Data_64_bytes_1[33] := PlcOutputs._12a1_User_Data_64_bytes_1[33]; + HwOutputs._12a1_User_Data_64_bytes_1[34] := PlcOutputs._12a1_User_Data_64_bytes_1[34]; + HwOutputs._12a1_User_Data_64_bytes_1[35] := PlcOutputs._12a1_User_Data_64_bytes_1[35]; + HwOutputs._12a1_User_Data_64_bytes_1[36] := PlcOutputs._12a1_User_Data_64_bytes_1[36]; + HwOutputs._12a1_User_Data_64_bytes_1[37] := PlcOutputs._12a1_User_Data_64_bytes_1[37]; + HwOutputs._12a1_User_Data_64_bytes_1[38] := PlcOutputs._12a1_User_Data_64_bytes_1[38]; + HwOutputs._12a1_User_Data_64_bytes_1[39] := PlcOutputs._12a1_User_Data_64_bytes_1[39]; + HwOutputs._12a1_User_Data_64_bytes_1[40] := PlcOutputs._12a1_User_Data_64_bytes_1[40]; + HwOutputs._12a1_User_Data_64_bytes_1[41] := PlcOutputs._12a1_User_Data_64_bytes_1[41]; + HwOutputs._12a1_User_Data_64_bytes_1[42] := PlcOutputs._12a1_User_Data_64_bytes_1[42]; + HwOutputs._12a1_User_Data_64_bytes_1[43] := PlcOutputs._12a1_User_Data_64_bytes_1[43]; + HwOutputs._12a1_User_Data_64_bytes_1[44] := PlcOutputs._12a1_User_Data_64_bytes_1[44]; + HwOutputs._12a1_User_Data_64_bytes_1[45] := PlcOutputs._12a1_User_Data_64_bytes_1[45]; + HwOutputs._12a1_User_Data_64_bytes_1[46] := PlcOutputs._12a1_User_Data_64_bytes_1[46]; + HwOutputs._12a1_User_Data_64_bytes_1[47] := PlcOutputs._12a1_User_Data_64_bytes_1[47]; + HwOutputs._12a1_User_Data_64_bytes_1[48] := PlcOutputs._12a1_User_Data_64_bytes_1[48]; + HwOutputs._12a1_User_Data_64_bytes_1[49] := PlcOutputs._12a1_User_Data_64_bytes_1[49]; + HwOutputs._12a1_User_Data_64_bytes_1[50] := PlcOutputs._12a1_User_Data_64_bytes_1[50]; + HwOutputs._12a1_User_Data_64_bytes_1[51] := PlcOutputs._12a1_User_Data_64_bytes_1[51]; + HwOutputs._12a1_User_Data_64_bytes_1[52] := PlcOutputs._12a1_User_Data_64_bytes_1[52]; + HwOutputs._12a1_User_Data_64_bytes_1[53] := PlcOutputs._12a1_User_Data_64_bytes_1[53]; + HwOutputs._12a1_User_Data_64_bytes_1[54] := PlcOutputs._12a1_User_Data_64_bytes_1[54]; + HwOutputs._12a1_User_Data_64_bytes_1[55] := PlcOutputs._12a1_User_Data_64_bytes_1[55]; + HwOutputs._12a1_User_Data_64_bytes_1[56] := PlcOutputs._12a1_User_Data_64_bytes_1[56]; + HwOutputs._12a1_User_Data_64_bytes_1[57] := PlcOutputs._12a1_User_Data_64_bytes_1[57]; + HwOutputs._12a1_User_Data_64_bytes_1[58] := PlcOutputs._12a1_User_Data_64_bytes_1[58]; + HwOutputs._12a1_User_Data_64_bytes_1[59] := PlcOutputs._12a1_User_Data_64_bytes_1[59]; + HwOutputs._12a1_User_Data_64_bytes_1[60] := PlcOutputs._12a1_User_Data_64_bytes_1[60]; + HwOutputs._12a1_User_Data_64_bytes_1[61] := PlcOutputs._12a1_User_Data_64_bytes_1[61]; + HwOutputs._12a1_User_Data_64_bytes_1[62] := PlcOutputs._12a1_User_Data_64_bytes_1[62]; + HwOutputs._12a1_User_Data_64_bytes_1[63] := PlcOutputs._12a1_User_Data_64_bytes_1[63]; + HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; + HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; + HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; + HwOutputs._10a1_User_Data_128_bytes_1[0] := PlcOutputs._10a1_User_Data_128_bytes_1[0]; + HwOutputs._10a1_User_Data_128_bytes_1[1] := PlcOutputs._10a1_User_Data_128_bytes_1[1]; + HwOutputs._10a1_User_Data_128_bytes_1[2] := PlcOutputs._10a1_User_Data_128_bytes_1[2]; + HwOutputs._10a1_User_Data_128_bytes_1[3] := PlcOutputs._10a1_User_Data_128_bytes_1[3]; + HwOutputs._10a1_User_Data_128_bytes_1[4] := PlcOutputs._10a1_User_Data_128_bytes_1[4]; + HwOutputs._10a1_User_Data_128_bytes_1[5] := PlcOutputs._10a1_User_Data_128_bytes_1[5]; + HwOutputs._10a1_User_Data_128_bytes_1[6] := PlcOutputs._10a1_User_Data_128_bytes_1[6]; + HwOutputs._10a1_User_Data_128_bytes_1[7] := PlcOutputs._10a1_User_Data_128_bytes_1[7]; + HwOutputs._10a1_User_Data_128_bytes_1[8] := PlcOutputs._10a1_User_Data_128_bytes_1[8]; + HwOutputs._10a1_User_Data_128_bytes_1[9] := PlcOutputs._10a1_User_Data_128_bytes_1[9]; + HwOutputs._10a1_User_Data_128_bytes_1[10] := PlcOutputs._10a1_User_Data_128_bytes_1[10]; + HwOutputs._10a1_User_Data_128_bytes_1[11] := PlcOutputs._10a1_User_Data_128_bytes_1[11]; + HwOutputs._10a1_User_Data_128_bytes_1[12] := PlcOutputs._10a1_User_Data_128_bytes_1[12]; + HwOutputs._10a1_User_Data_128_bytes_1[13] := PlcOutputs._10a1_User_Data_128_bytes_1[13]; + HwOutputs._10a1_User_Data_128_bytes_1[14] := PlcOutputs._10a1_User_Data_128_bytes_1[14]; + HwOutputs._10a1_User_Data_128_bytes_1[15] := PlcOutputs._10a1_User_Data_128_bytes_1[15]; + HwOutputs._10a1_User_Data_128_bytes_1[16] := PlcOutputs._10a1_User_Data_128_bytes_1[16]; + HwOutputs._10a1_User_Data_128_bytes_1[17] := PlcOutputs._10a1_User_Data_128_bytes_1[17]; + HwOutputs._10a1_User_Data_128_bytes_1[18] := PlcOutputs._10a1_User_Data_128_bytes_1[18]; + HwOutputs._10a1_User_Data_128_bytes_1[19] := PlcOutputs._10a1_User_Data_128_bytes_1[19]; + HwOutputs._10a1_User_Data_128_bytes_1[20] := PlcOutputs._10a1_User_Data_128_bytes_1[20]; + HwOutputs._10a1_User_Data_128_bytes_1[21] := PlcOutputs._10a1_User_Data_128_bytes_1[21]; + HwOutputs._10a1_User_Data_128_bytes_1[22] := PlcOutputs._10a1_User_Data_128_bytes_1[22]; + HwOutputs._10a1_User_Data_128_bytes_1[23] := PlcOutputs._10a1_User_Data_128_bytes_1[23]; + HwOutputs._10a1_User_Data_128_bytes_1[24] := PlcOutputs._10a1_User_Data_128_bytes_1[24]; + HwOutputs._10a1_User_Data_128_bytes_1[25] := PlcOutputs._10a1_User_Data_128_bytes_1[25]; + HwOutputs._10a1_User_Data_128_bytes_1[26] := PlcOutputs._10a1_User_Data_128_bytes_1[26]; + HwOutputs._10a1_User_Data_128_bytes_1[27] := PlcOutputs._10a1_User_Data_128_bytes_1[27]; + HwOutputs._10a1_User_Data_128_bytes_1[28] := PlcOutputs._10a1_User_Data_128_bytes_1[28]; + HwOutputs._10a1_User_Data_128_bytes_1[29] := PlcOutputs._10a1_User_Data_128_bytes_1[29]; + HwOutputs._10a1_User_Data_128_bytes_1[30] := PlcOutputs._10a1_User_Data_128_bytes_1[30]; + HwOutputs._10a1_User_Data_128_bytes_1[31] := PlcOutputs._10a1_User_Data_128_bytes_1[31]; + HwOutputs._10a1_User_Data_128_bytes_1[32] := PlcOutputs._10a1_User_Data_128_bytes_1[32]; + HwOutputs._10a1_User_Data_128_bytes_1[33] := PlcOutputs._10a1_User_Data_128_bytes_1[33]; + HwOutputs._10a1_User_Data_128_bytes_1[34] := PlcOutputs._10a1_User_Data_128_bytes_1[34]; + HwOutputs._10a1_User_Data_128_bytes_1[35] := PlcOutputs._10a1_User_Data_128_bytes_1[35]; + HwOutputs._10a1_User_Data_128_bytes_1[36] := PlcOutputs._10a1_User_Data_128_bytes_1[36]; + HwOutputs._10a1_User_Data_128_bytes_1[37] := PlcOutputs._10a1_User_Data_128_bytes_1[37]; + HwOutputs._10a1_User_Data_128_bytes_1[38] := PlcOutputs._10a1_User_Data_128_bytes_1[38]; + HwOutputs._10a1_User_Data_128_bytes_1[39] := PlcOutputs._10a1_User_Data_128_bytes_1[39]; + HwOutputs._10a1_User_Data_128_bytes_1[40] := PlcOutputs._10a1_User_Data_128_bytes_1[40]; + HwOutputs._10a1_User_Data_128_bytes_1[41] := PlcOutputs._10a1_User_Data_128_bytes_1[41]; + HwOutputs._10a1_User_Data_128_bytes_1[42] := PlcOutputs._10a1_User_Data_128_bytes_1[42]; + HwOutputs._10a1_User_Data_128_bytes_1[43] := PlcOutputs._10a1_User_Data_128_bytes_1[43]; + HwOutputs._10a1_User_Data_128_bytes_1[44] := PlcOutputs._10a1_User_Data_128_bytes_1[44]; + HwOutputs._10a1_User_Data_128_bytes_1[45] := PlcOutputs._10a1_User_Data_128_bytes_1[45]; + HwOutputs._10a1_User_Data_128_bytes_1[46] := PlcOutputs._10a1_User_Data_128_bytes_1[46]; + HwOutputs._10a1_User_Data_128_bytes_1[47] := PlcOutputs._10a1_User_Data_128_bytes_1[47]; + HwOutputs._10a1_User_Data_128_bytes_1[48] := PlcOutputs._10a1_User_Data_128_bytes_1[48]; + HwOutputs._10a1_User_Data_128_bytes_1[49] := PlcOutputs._10a1_User_Data_128_bytes_1[49]; + HwOutputs._10a1_User_Data_128_bytes_1[50] := PlcOutputs._10a1_User_Data_128_bytes_1[50]; + HwOutputs._10a1_User_Data_128_bytes_1[51] := PlcOutputs._10a1_User_Data_128_bytes_1[51]; + HwOutputs._10a1_User_Data_128_bytes_1[52] := PlcOutputs._10a1_User_Data_128_bytes_1[52]; + HwOutputs._10a1_User_Data_128_bytes_1[53] := PlcOutputs._10a1_User_Data_128_bytes_1[53]; + HwOutputs._10a1_User_Data_128_bytes_1[54] := PlcOutputs._10a1_User_Data_128_bytes_1[54]; + HwOutputs._10a1_User_Data_128_bytes_1[55] := PlcOutputs._10a1_User_Data_128_bytes_1[55]; + HwOutputs._10a1_User_Data_128_bytes_1[56] := PlcOutputs._10a1_User_Data_128_bytes_1[56]; + HwOutputs._10a1_User_Data_128_bytes_1[57] := PlcOutputs._10a1_User_Data_128_bytes_1[57]; + HwOutputs._10a1_User_Data_128_bytes_1[58] := PlcOutputs._10a1_User_Data_128_bytes_1[58]; + HwOutputs._10a1_User_Data_128_bytes_1[59] := PlcOutputs._10a1_User_Data_128_bytes_1[59]; + HwOutputs._10a1_User_Data_128_bytes_1[60] := PlcOutputs._10a1_User_Data_128_bytes_1[60]; + HwOutputs._10a1_User_Data_128_bytes_1[61] := PlcOutputs._10a1_User_Data_128_bytes_1[61]; + HwOutputs._10a1_User_Data_128_bytes_1[62] := PlcOutputs._10a1_User_Data_128_bytes_1[62]; + HwOutputs._10a1_User_Data_128_bytes_1[63] := PlcOutputs._10a1_User_Data_128_bytes_1[63]; + HwOutputs._10a1_User_Data_128_bytes_1[64] := PlcOutputs._10a1_User_Data_128_bytes_1[64]; + HwOutputs._10a1_User_Data_128_bytes_1[65] := PlcOutputs._10a1_User_Data_128_bytes_1[65]; + HwOutputs._10a1_User_Data_128_bytes_1[66] := PlcOutputs._10a1_User_Data_128_bytes_1[66]; + HwOutputs._10a1_User_Data_128_bytes_1[67] := PlcOutputs._10a1_User_Data_128_bytes_1[67]; + HwOutputs._10a1_User_Data_128_bytes_1[68] := PlcOutputs._10a1_User_Data_128_bytes_1[68]; + HwOutputs._10a1_User_Data_128_bytes_1[69] := PlcOutputs._10a1_User_Data_128_bytes_1[69]; + HwOutputs._10a1_User_Data_128_bytes_1[70] := PlcOutputs._10a1_User_Data_128_bytes_1[70]; + HwOutputs._10a1_User_Data_128_bytes_1[71] := PlcOutputs._10a1_User_Data_128_bytes_1[71]; + HwOutputs._10a1_User_Data_128_bytes_1[72] := PlcOutputs._10a1_User_Data_128_bytes_1[72]; + HwOutputs._10a1_User_Data_128_bytes_1[73] := PlcOutputs._10a1_User_Data_128_bytes_1[73]; + HwOutputs._10a1_User_Data_128_bytes_1[74] := PlcOutputs._10a1_User_Data_128_bytes_1[74]; + HwOutputs._10a1_User_Data_128_bytes_1[75] := PlcOutputs._10a1_User_Data_128_bytes_1[75]; + HwOutputs._10a1_User_Data_128_bytes_1[76] := PlcOutputs._10a1_User_Data_128_bytes_1[76]; + HwOutputs._10a1_User_Data_128_bytes_1[77] := PlcOutputs._10a1_User_Data_128_bytes_1[77]; + HwOutputs._10a1_User_Data_128_bytes_1[78] := PlcOutputs._10a1_User_Data_128_bytes_1[78]; + HwOutputs._10a1_User_Data_128_bytes_1[79] := PlcOutputs._10a1_User_Data_128_bytes_1[79]; + HwOutputs._10a1_User_Data_128_bytes_1[80] := PlcOutputs._10a1_User_Data_128_bytes_1[80]; + HwOutputs._10a1_User_Data_128_bytes_1[81] := PlcOutputs._10a1_User_Data_128_bytes_1[81]; + HwOutputs._10a1_User_Data_128_bytes_1[82] := PlcOutputs._10a1_User_Data_128_bytes_1[82]; + HwOutputs._10a1_User_Data_128_bytes_1[83] := PlcOutputs._10a1_User_Data_128_bytes_1[83]; + HwOutputs._10a1_User_Data_128_bytes_1[84] := PlcOutputs._10a1_User_Data_128_bytes_1[84]; + HwOutputs._10a1_User_Data_128_bytes_1[85] := PlcOutputs._10a1_User_Data_128_bytes_1[85]; + HwOutputs._10a1_User_Data_128_bytes_1[86] := PlcOutputs._10a1_User_Data_128_bytes_1[86]; + HwOutputs._10a1_User_Data_128_bytes_1[87] := PlcOutputs._10a1_User_Data_128_bytes_1[87]; + HwOutputs._10a1_User_Data_128_bytes_1[88] := PlcOutputs._10a1_User_Data_128_bytes_1[88]; + HwOutputs._10a1_User_Data_128_bytes_1[89] := PlcOutputs._10a1_User_Data_128_bytes_1[89]; + HwOutputs._10a1_User_Data_128_bytes_1[90] := PlcOutputs._10a1_User_Data_128_bytes_1[90]; + HwOutputs._10a1_User_Data_128_bytes_1[91] := PlcOutputs._10a1_User_Data_128_bytes_1[91]; + HwOutputs._10a1_User_Data_128_bytes_1[92] := PlcOutputs._10a1_User_Data_128_bytes_1[92]; + HwOutputs._10a1_User_Data_128_bytes_1[93] := PlcOutputs._10a1_User_Data_128_bytes_1[93]; + HwOutputs._10a1_User_Data_128_bytes_1[94] := PlcOutputs._10a1_User_Data_128_bytes_1[94]; + HwOutputs._10a1_User_Data_128_bytes_1[95] := PlcOutputs._10a1_User_Data_128_bytes_1[95]; + HwOutputs._10a1_User_Data_128_bytes_1[96] := PlcOutputs._10a1_User_Data_128_bytes_1[96]; + HwOutputs._10a1_User_Data_128_bytes_1[97] := PlcOutputs._10a1_User_Data_128_bytes_1[97]; + HwOutputs._10a1_User_Data_128_bytes_1[98] := PlcOutputs._10a1_User_Data_128_bytes_1[98]; + HwOutputs._10a1_User_Data_128_bytes_1[99] := PlcOutputs._10a1_User_Data_128_bytes_1[99]; + HwOutputs._10a1_User_Data_128_bytes_1[100] := PlcOutputs._10a1_User_Data_128_bytes_1[100]; + HwOutputs._10a1_User_Data_128_bytes_1[101] := PlcOutputs._10a1_User_Data_128_bytes_1[101]; + HwOutputs._10a1_User_Data_128_bytes_1[102] := PlcOutputs._10a1_User_Data_128_bytes_1[102]; + HwOutputs._10a1_User_Data_128_bytes_1[103] := PlcOutputs._10a1_User_Data_128_bytes_1[103]; + HwOutputs._10a1_User_Data_128_bytes_1[104] := PlcOutputs._10a1_User_Data_128_bytes_1[104]; + HwOutputs._10a1_User_Data_128_bytes_1[105] := PlcOutputs._10a1_User_Data_128_bytes_1[105]; + HwOutputs._10a1_User_Data_128_bytes_1[106] := PlcOutputs._10a1_User_Data_128_bytes_1[106]; + HwOutputs._10a1_User_Data_128_bytes_1[107] := PlcOutputs._10a1_User_Data_128_bytes_1[107]; + HwOutputs._10a1_User_Data_128_bytes_1[108] := PlcOutputs._10a1_User_Data_128_bytes_1[108]; + HwOutputs._10a1_User_Data_128_bytes_1[109] := PlcOutputs._10a1_User_Data_128_bytes_1[109]; + HwOutputs._10a1_User_Data_128_bytes_1[110] := PlcOutputs._10a1_User_Data_128_bytes_1[110]; + HwOutputs._10a1_User_Data_128_bytes_1[111] := PlcOutputs._10a1_User_Data_128_bytes_1[111]; + HwOutputs._10a1_User_Data_128_bytes_1[112] := PlcOutputs._10a1_User_Data_128_bytes_1[112]; + HwOutputs._10a1_User_Data_128_bytes_1[113] := PlcOutputs._10a1_User_Data_128_bytes_1[113]; + HwOutputs._10a1_User_Data_128_bytes_1[114] := PlcOutputs._10a1_User_Data_128_bytes_1[114]; + HwOutputs._10a1_User_Data_128_bytes_1[115] := PlcOutputs._10a1_User_Data_128_bytes_1[115]; + HwOutputs._10a1_User_Data_128_bytes_1[116] := PlcOutputs._10a1_User_Data_128_bytes_1[116]; + HwOutputs._10a1_User_Data_128_bytes_1[117] := PlcOutputs._10a1_User_Data_128_bytes_1[117]; + HwOutputs._10a1_User_Data_128_bytes_1[118] := PlcOutputs._10a1_User_Data_128_bytes_1[118]; + HwOutputs._10a1_User_Data_128_bytes_1[119] := PlcOutputs._10a1_User_Data_128_bytes_1[119]; + HwOutputs._10a1_User_Data_128_bytes_1[120] := PlcOutputs._10a1_User_Data_128_bytes_1[120]; + HwOutputs._10a1_User_Data_128_bytes_1[121] := PlcOutputs._10a1_User_Data_128_bytes_1[121]; + HwOutputs._10a1_User_Data_128_bytes_1[122] := PlcOutputs._10a1_User_Data_128_bytes_1[122]; + HwOutputs._10a1_User_Data_128_bytes_1[123] := PlcOutputs._10a1_User_Data_128_bytes_1[123]; + HwOutputs._10a1_User_Data_128_bytes_1[124] := PlcOutputs._10a1_User_Data_128_bytes_1[124]; + HwOutputs._10a1_User_Data_128_bytes_1[125] := PlcOutputs._10a1_User_Data_128_bytes_1[125]; + HwOutputs._10a1_User_Data_128_bytes_1[126] := PlcOutputs._10a1_User_Data_128_bytes_1[126]; + HwOutputs._10a1_User_Data_128_bytes_1[127] := PlcOutputs._10a1_User_Data_128_bytes_1[127]; + HwOutputs._10a1_User_Data_128_bytes_1[128] := PlcOutputs._10a1_User_Data_128_bytes_1[128]; + HwOutputs._10a1_User_Data_128_bytes_1[129] := PlcOutputs._10a1_User_Data_128_bytes_1[129]; + HwOutputs._10a1_User_Data_128_bytes_1[130] := PlcOutputs._10a1_User_Data_128_bytes_1[130]; + HwOutputs._10a1_User_Data_128_bytes_1[131] := PlcOutputs._10a1_User_Data_128_bytes_1[131]; +END_FUNCTION diff --git a/Export/PLC_1/HwInputs.st b/Export/PLC_1/HwInputs.st new file mode 100644 index 000000000..9dfa1760b --- /dev/null +++ b/Export/PLC_1/HwInputs.st @@ -0,0 +1,15 @@ +TYPE + HwInputs : STRUCT + _11a1_DI_8x24VDC_ST_1 AT %B0 : BYTE; + _11a1_DI_8x24VDC_ST_2 AT %B1 : BYTE; + _12a1_Acquisition_Status_1 AT %B2 : ARRAY[0..2] OF BYTE; + _12a1_Inspection_Status_1 AT %B5 : DWORD; + _12a1_Command_Control_1 AT %B9 : WORD; + _12a1_SoftEvent_Control_1 AT %B11 : BYTE; + _12a1_Results_64_bytes_1 AT %B12 : ARRAY[0..67] OF BYTE; + _10a1_Acquisition_Status_1 AT %B80 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 AT %B83 : BYTE; + _10a1_Soft_Event_Control_1 AT %B84 : BYTE; + _10a1_Result_Data_128_bytes_1 AT %B85 : ARRAY[0..135] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/Export/PLC_1/HwOutputs.st b/Export/PLC_1/HwOutputs.st new file mode 100644 index 000000000..97d565aed --- /dev/null +++ b/Export/PLC_1/HwOutputs.st @@ -0,0 +1,14 @@ +TYPE + HwOutputs : STRUCT + _11a1_DQ_8x24VDC_0_5A_ST_1 AT %B0 : BYTE; + _12a1_Acquisition_Control_1 AT %B1 : BYTE; + _12a1_Inspection_Control_1 AT %B2 : BYTE; + _12a1_Command_Control_1 AT %B3 : WORD; + _12a1_SoftEvent_Control_1 AT %B5 : BYTE; + _12a1_User_Data_64_bytes_1 AT %B6 : ARRAY[0..63] OF BYTE; + _10a1_Acquisition_Control_1 AT %B70 : BYTE; + _10a1_Results_Control_1 AT %B71 : BYTE; + _10a1_Soft_Event_Control_1 AT %B72 : BYTE; + _10a1_User_Data_128_bytes_1 AT %B73 : ARRAY[0..131] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/Export/PLC_1/PlcInputs.st b/Export/PLC_1/PlcInputs.st new file mode 100644 index 000000000..7fe1d3a2a --- /dev/null +++ b/Export/PLC_1/PlcInputs.st @@ -0,0 +1,15 @@ +TYPE + PlcInputs : STRUCT + _11a1_DI_8x24VDC_ST_1 : BYTE; + _11a1_DI_8x24VDC_ST_2 : BYTE; + _12a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _12a1_Inspection_Status_1 : DWORD; + _12a1_Command_Control_1 : WORD; + _12a1_SoftEvent_Control_1 : BYTE; + _12a1_Results_64_bytes_1 : ARRAY[0..67] OF BYTE; + _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/Export/PLC_1/PlcOutputs.st b/Export/PLC_1/PlcOutputs.st new file mode 100644 index 000000000..2ea4d4ab4 --- /dev/null +++ b/Export/PLC_1/PlcOutputs.st @@ -0,0 +1,14 @@ +TYPE + PlcOutputs : STRUCT + _11a1_DQ_8x24VDC_0_5A_ST_1 : BYTE; + _12a1_Acquisition_Control_1 : BYTE; + _12a1_Inspection_Control_1 : BYTE; + _12a1_Command_Control_1 : WORD; + _12a1_SoftEvent_Control_1 : BYTE; + _12a1_User_Data_64_bytes_1 : ARRAY[0..63] OF BYTE; + _10a1_Acquisition_Control_1 : BYTE; + _10a1_Results_Control_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION b/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION new file mode 100644 index 000000000..0617acc51 --- /dev/null +++ b/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION @@ -0,0 +1,8 @@ + //Copy this VAR_GLOBAL section into your configuration file inside your project. + //Do not change any names, addresses or any another content. + VAR_GLOBAL + HwInputs AT %IB0 : HwInputs; + HwOutputs AT %QB0 : HwOutputs; + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR diff --git a/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM b/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM new file mode 100644 index 000000000..45e075f36 --- /dev/null +++ b/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM @@ -0,0 +1,12 @@ + //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. + //Do not change any names, addresses or any another content. + VAR_EXTERNAL + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR + //Copy this function call at the very beginning of your program. + //Do not change any names, addresses or any another content. + CopyInputs(); + //Copy this function call at the very end of your program. + //Do not change any names, addresses or any another content. + CopyOutputs(); diff --git a/close b/close new file mode 100644 index 000000000..c33e48d0c --- /dev/null +++ b/close @@ -0,0 +1,750 @@ +commit e7299920d5cd2a1ef8ce210f93e757a5c539210a (HEAD -> dev, origin/dev, origin/HEAD, Component_CgnReader_LukyTest01) +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Wed Jun 14 14:41:49 2023 +0200 + + updates documentation + +commit 832f800306aae737aae76b63d288a21ceb828042 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Wed Jun 14 14:39:19 2023 +0200 + + [NEW-FEATURE] AxoMessanger should use context logger to provide logging (#98) + + * Create draft PR for #97 + # Identity is not handled by hlap. + + * wip, unit test for object indentity removed due to handling by higher level app + + * add documentation for axo logger and indenties + + * updates to v0.14.0-alpha.108 + + * fix broken compatibility after update to 0.14.0-alpha.108 + + --------- + + Co-authored-by: PTKu + +commit 6211ac98b7961dfb6b07ea01fc748332f36ac242 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Tue Jun 13 06:03:28 2023 +0200 + + [UPDATE] Update to sdk 4.0.2 (#104) + + * Create draft PR for #103 + + * Updates to "@ax/sdk": ^4.0.2 and latest + + --------- + + Co-authored-by: PTKu + +commit d706dfb856487103ce83c79c99612af00693c8a1 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Mon Jun 12 20:36:56 2023 +0200 + + [BUG] Open data window when is not requested (#102) + + * Create draft PR for #101 + + * Updated data window closing + + --------- + + Co-authored-by: Brano5 + Co-authored-by: Branko Zachemsky + +commit 9553d27e1c8f12b61740ab231200a80a650d1865 +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Thu Jun 8 14:42:51 2023 +0200 + + fixed slnf + +commit e9a9d1289b7692ae370edca9c22bcba060390339 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Thu Jun 8 14:08:41 2023 +0200 + + [NEW-FEATURE] Add identity to logging for user actions. (#96) + + * Adds user information to the logging + - security split in two different assemblies (blazor, clr) + - adds information about user perfoming actions. + - removers user info from the app object (must be provided as argument of log function) + - adds logging from AxoTask and AxoToggle task + - context logger now creates a log entry when an message/alarm occurs + - in controller loggers we will need to address the objects identity + + * removes file referenced dependency + + * tests added to L1 running only net7.0 target + + --------- + + Co-authored-by: PTKu + +commit 077f1750749f5dd8a2d87311ecf41235a51b02ff +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Tue Jun 6 16:45:54 2023 +0200 + + fix docu link and regen docs + +commit 1d680631132c2b9db62c4374b74dbeb3084f50f0 +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Tue Jun 6 15:37:38 2023 +0200 + + documenation update + +commit 5d52e7d824b0ed5ca416ffb71e61c98bcbd46254 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Tue Jun 6 15:30:31 2023 +0200 + + [NEW-FEATURE] User and events logging (#90) + + * Create draft PR for #89 + * adds simple event logger (message only) no identity + * from @ax/sdk4.0.1 back "@ax/sdk": ^3.0.18, much trouble + * major refactoring of logging and messaging adds logger documentation (wip) + * add examples and documentation for logging + Removes dynamic messaging and moves static messaging and logging to core. This required major refactoring + keeps using "@ax/sdk": ^3.0.18 due breaking changes in "@ax/sdk": ^4.0.2 + add logging capabilities, we can now log messages from the PLC, however, there is no identity provider implemented yet the log text must provide details. + default logger is the application logger (AxoApplication.Logger) + performance has to still be tested to determine the min. perf. requirements for the system (for details see the documentation). + adds an implementation of Serilog logger for AxoApplication (kept simple, lot of potential for extending). + + --------- + + Co-authored-by: PTKu + +commit fd0ea08cba076d4104461673e4b88b2c3c4a219e +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Tue May 30 09:52:56 2023 +0200 + + Removes dependency of messaging on core to prevent circlularity (#94) + + * removes circular dependencies messaging - core + * removes dynamic messenger (we will keep going with static until we get better com prefomance) + +commit ff1591aaff4222d7212854a3316ef91f6646306d +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Fri May 26 17:14:09 2023 +0200 + + regens documentation with 0.14.0-alpha.107 ixd + +commit 412226a150da6cdf7acdda07e2d09de51bf85a10 +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Thu May 25 16:54:02 2023 +0200 + + documetation re-build + +commit 19d7f8806f5551ea4106e977fb6f5c020b10c31a +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Thu May 25 16:41:55 2023 +0200 + + [NEW-FEATURE] Port security from tco (#60) + + * Create draft PR for #57 + + * create BlazorAuthApp with Auth + + * Update AuthenticationStateProvider service + + * Name refactoring + + * Extract Security to own library + + * Refactoring Security + + * Security refactoring + + * Security refactoring - hashing password, add ravenDB and inMemory implementation for security + + * Security refactoring - added external authentication + + * some changes in ExternalTokenAuthorization + + * Security refactoring + + * Added Example view + + * Security refactoring + + * Security refactoring - AppIdentity + + * Removed UserAccessor + + * Security refactoring + + * refactoring of security, added tests from tcopen wip + + * Security - tests repair + + * added authorization tests, wip on security on multiple clients + + * added initial project for new security, refactoring wip + + * Added role and group for security, refactoring + + * Security refactoring + + * Security refactoring + + * refactor of tests, some minor changes + + * Refactoring + + * Security refactoring + + * wip on security documentation + + * Small changes in RoleGroupManager + + * wip on security docs + + * wip on security + + * Added Example view, wip with documentation + + * wip on sec docs + + * New images in security docs + + * Security Test fix + + * minor changes to models + + * code refactoring, added selected all checkbox to groups + + * adds unit test for security to cake + + --------- + + Co-authored-by: Brano5 + Co-authored-by: Branko Zachemsky + Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> + +commit 46e8a480aae01d03ec152b9ccea84f274a7379f7 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Thu May 25 13:18:33 2023 +0200 + + [Blazor] Momentary task stays in switched on state when button is pressed and page is left by any reason. (#91) + + * Create draft PR for #66 + + * added unfocusout event to momentary task button + + --------- + + Co-authored-by: Specter-13 + Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> + +commit 30508dabb36abafcdabdb24160c4880e5ed372c5 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Thu May 25 12:22:06 2023 +0200 + + Fixes some issues adds integration tests and adds documentation for AxoData (fragments) (#93) + + * fixes some issues with AxoDataFragments + - adds cyclic run method to handle remote calls + - adds integration tests for AxoDataFragments + + * add documentation of AxoDataFragmentExchange and examples + + * fix an run override issue in template + + * add in-code documenation + +commit 03575d26490913ca44ba62e45ffd1b81d606bbe6 +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Tue May 23 07:55:43 2023 +0200 + + documentation regen + +commit 9a791859784c5140d9b45ca37a21213b4f2b70c1 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Tue May 23 07:48:11 2023 +0200 + + updates to v0.14.0-alpha.106 (#88) + +commit 658f101c4cd5dcba24c2d11cf02aeff9f8730d22 +Author: Peto Kurhajec +Date: Mon May 22 11:34:17 2023 +0200 + + adds ign sandbox folder + +commit 7a83eeaf2142e5b7f9f9543c3fa08b4fddd4108d +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Fri May 19 18:36:31 2023 +0200 + + Adds support for combining data scattered over multiple repositories (#85) + + * fixes an isssue where steps in sequencer were not displayed in correct order + + * [wip] adds fragmented data exchange + + * wip + + * wip + + * wip + + * wip + + * fixes axodata documentaion to reflect changes + +commit 7682962945b9d55a481a52e37ea2144e767b8dfb +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Fri May 19 16:57:43 2023 +0200 + + adds project workspace file + +commit 624c1e84bdc9e3989377ad57badeaec55509ef68 +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Fri May 19 16:56:38 2023 +0200 + + CA-CC-BUILD + +commit ea894dd6490cd01c8aeb27174e84cf9cdd45a3c9 +Author: BlazejK +Date: Fri May 19 13:14:35 2023 +0200 + + added local snippets for ix-compiler attributes (#86) + + Co-authored-by: blazej.kuhajda + +commit 70d50bda39ef88ca2cfb37211e3b67333bb043a1 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Thu May 18 16:40:37 2023 +0200 + + Add documentation for AxoMessenger (#84) + + * Create draft PR for #83 + + * adds documentation for AxoMessaging static + + --------- + + Co-authored-by: TomKovac + Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> + +commit b31e7560a1bc471fa37466fac8f5994a2e614996 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Wed May 17 12:44:54 2023 +0200 + + Create unit tests for messaging (tranfered from tco) (#78) + + * Create draft PR for #55 + + * wip messaging + + * AxoMessengerStatic + + * AxoMessengerStatic + + * AxoMesenger static tests added + + * update ax/sdk =>3.0.18 + + * cleanup unnecessary packages from apax.yaml's + + * AxoMessenger static view colors changed to match the verbosity + + * build fix + + --------- + + Co-authored-by: TomKovac + Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> + +commit 90ea1ec72795457f3a6ef6476e9ca15529a53c59 +Author: BlazejK +Date: Mon May 15 13:11:39 2023 +0200 + + removes depenency to legacy Ix.Compiler (#82) + + Co-authored-by: blazej.kuhajda + +commit e27f2d601ad55a24220357521b7d7abadc7bceb5 +Author: Brano5 <97288158+Brano5@users.noreply.github.com> +Date: Fri May 5 15:05:20 2023 +0200 + + Solving some bugs in the axo data (#81) + + * Update InMemoryRepository + + * Some changes in AxoDataView and AxoDataViewModel + + --------- + + Co-authored-by: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> + +commit bc0e4f7c3c0961b721024104962b4d0bede6662f +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Fri May 5 13:18:38 2023 +0200 + + Template additions (#80) + + * various updates and fixies + - updates to v0.14.0-alpha.97 + - adds missing js scripts to template + - adds new snippets + - add utitlity to scaffold snippets from code + - removes readonce from step description + - changes tempalte to use AxoSequencerContainer instead of AxoSequencer + + * improvement to visua of sequencer and step + +commit 74bb094fbaa4b97bbb195def503e2eed56dddd8c +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Thu May 4 13:57:41 2023 +0200 + + various updates and fixies (#79) + + - updates to v0.14.0-alpha.97 + - adds missing js scripts to template + - adds new snippets + - add utitlity to scaffold snippets from code + - removes readonce from step description + - changes tempalte to use AxoSequencerContainer instead of AxoSequencer + +commit aeff8dffb57fffb16ad85525e982bbafc0a8e0b2 +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Wed May 3 14:11:36 2023 +0200 + + documentation update + +commit 556145e060f631b38b5abceb9dad542a52055fc7 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Wed May 3 14:10:23 2023 +0200 + + [BUG] Sequencer should not execute code that is outside steps (#72) + + * Create draft PR for #67 + + * AxoSequencerContainer + + --------- + + Co-authored-by: TomKovac + Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> + +commit effd032ff71deb7640c18e5d13af26c5efc192fe +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Wed May 3 13:30:49 2023 +0200 + + Update README.md (#77) + +commit f253df45e5f52b09276501d9b9031a49aede504b +Author: Peter <61538034+PTKu@users.noreply.github.com> +Date: Wed May 3 13:21:54 2023 +0200 + + documentation regen + +commit b42ef8bf441059de530d83e2c402cf6457d30da0 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Wed May 3 13:19:46 2023 +0200 + + [DOCUMENTATION] axodata readme needs some polishing (#76) + + * Create draft PR for #59 + + * adds more documentation to axodata + linked examples + + * adds bootstrap.bundle.min.js to template.simple + + --------- + + Co-authored-by: PTKu + +commit 6977589674f11600c3d755bf65361040ce899d15 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Wed May 3 07:55:03 2023 +0200 + + additions and clean ups (#75) + + * additions and clean ups + - apax version number updates only when package publishsing is reqested + - cleans up simatic1500 and add simple IRtc implementation for S71500 targets + - add time measurement to AxoTask + - add start time signature to AxoTask + - updates to ax#0.14..0-alpha.96 + + * fixies dependency in s71500 abstaction library + + * null check for initial time stamp required due to missing implementation of rtc in tests + + * version update on dopack instead of dopublish + + * rev tags when publishes + +commit 92c40840541a77377dabfd564cbf884b016edcc4 +Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> +Date: Tue May 2 09:36:27 2023 +0200 + + Major refactoring to AXOpen, app template... just an huge PR (#70) + + * Create draft PR for #44 + + * scaffolds remote data exchange + + * experimenting with ix data, wip + + * Concept for Toaster + + * experimenting with ix data, wip + + * ix update + + * experimenting with ix data, wip + + * Create draft PR for #48 + + * Refactor folder IxCore and IxData + + * fixes reference for packables + + * temporarily disables clr test + + * clr tests back + + * sets tests for .net6.0 only + + * asp + + * removes integrations from L1 + + * asp + + * asp + + * adds probers and scaffolds integration testing for dataexchage + + * Add null object for unassinged objects + + * adds error details for task failures + + * adds exception to error message of remote task + + * messaging very first commit + + * Adds integration tests for repositories and whole remote looping with data exchange + + * wip + + * wip + + * [infrastructure] various build fixies + - test publishing + - adds packables + + * adds giversion.build to test project (pipeline failure) + + * downgrades gitversion build to v5.10.3 + + * [infrastructure]swaps tests order + + * hanging tests https://github.com/dotnet/aspnetcore/issues/3443#issuecomment-498329024 + + * asp + + * asp + + * asp + + * DataView design + + * raven integration tests moved to L3 + + * asp + + * AX tests are placed into different folder + + * added loading data on page startup, playing with mvvm + + * mvvm stuff + + * post merge fixies + + * Working buttons in ViewModel + + * Small changes in DataView + + * wip on filtering, added async methods for filtering + + * major refactoring messagning and utils moved to separate projects + + * [infrastructure] variaous build improvements + + * changes namesapces in messaging + + * WIP + + * Working on pagination. Added Messeging for Toast. Repair JsonRepository + + * update packages, replace plaintoshadow methods + + * wio on dataexchange problems + + * Working on filter. Added view for items + + * String builder added + + * Added noticed.md + + * update packages + + * wip getting rid of dynamic + + * wip on generics on dataentity + + * Changes in View + + * wip on data, updated to latest packages + + * small refactoring, implemented selected record and edit functionality, merge with command and status views + + * wip sendToPlc and FromPLC + small refactoring + + * Small changes in toaster + + * minor clean up + + * post merge fix + + * added basic integration unit tests for ixdata + + * Added IxDataTest struct + + * Rename Data to OnlineData + + * wip Update packages to 0.14.0-alpha.69 + + * wip + + * updates ix v0.14.0-alpha.90 solves an issue with ITwinObject generics + + * Change create, copy and load from plc in DataView + + * Fix LoadFromPLC method, changed toaster closing + + * Visual adjustments to DataView + + * rtc implementation added + + * updates to AX# packages + + * rtc injection + + * post merge build + + * wip export and import in DataView + + * backup before removing utils reference from core + + * StringBuilder moved to abstractions due to dependency hell + + * Added option for customizable columns + + * Messaging unit tests completed + + * [wip] doc + + * post merge issue + + * Clicable column in DataView + + * added DataEntityAttribute for marking data objects + + * Docs for Data + + * refactoring ix.framework => AXOpen for abstraction utils and messaging + + * porting to AXSharp and merge with messaging + + * fix packables + + * merge with data and post merge fixies + + * Refactoring-changed namespace from 'ix.framework.core' to 'AXOpen.Core' inside core assembly + + * Refactoring-Ix=>Axo inside core + + * post refactoring upadtes and fixies + + * post merge fixies + + * sync with dev + + * refactoring to AXOpen-renaming core + + * Refactoring-backup project files deleted + + * refactoring data + + * Refactoring data-projects renamed + + * Rafactoring data-namespace changed + + * Refactoring data-Axo prefix added + + * Refactoring data-sync with dev + + * adds missing package content and update to v.0.14.0-alpha.90 + + * sync with 'adds missing package content and update to v.0.14.0-alpha.90' + + * refacoring data + + * refactoring probers + + * cleanup + + * refactoring integrations + + * fix style reference in integration app + + * add template and some adjustments to the frmwrk + + * wip + + * adds ingore apax packages in abstractions + + * mend + + * wip + + * wip + + * wip + + * wip + + * mend + + * wip + + * wip + + * wip + + * removes externals + + * wip + + * merge with tom + + * docu regen + + * fixes to gross errors in data documenation + + * mend + + --------- + + Co-authored-by: PTKu + Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> + Co-authored-by: Branko Zachemsky + Co-authored-by: TomKovac + Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> + Co-authored-by: Dávid Špavor diff --git a/src/templates.simple/axosimple.app/Pages/UI/Io.razor b/src/templates.simple/axosimple.app/Pages/UI/Io.razor index 5b96bfbd5..903142f3a 100644 --- a/src/templates.simple/axosimple.app/Pages/UI/Io.razor +++ b/src/templates.simple/axosimple.app/Pages/UI/Io.razor @@ -14,7 +14,12 @@

Outputs

- + +
+
+
+

PlcInputs

+
\ No newline at end of file diff --git a/src/templates.simple/axosimple.twin/Entry.cs b/src/templates.simple/axosimple.twin/Entry.cs index 230c75996..8ce14c7b2 100644 --- a/src/templates.simple/axosimple.twin/Entry.cs +++ b/src/templates.simple/axosimple.twin/Entry.cs @@ -17,7 +17,7 @@ namespace axosimple { public static class Entry { - private const string TargetIp = "192.168.0.4"; // <- replace by your IP + private const string TargetIp = "10.10.10.1"; // <- replace by your IP private const string UserName = "Everybody"; //<- replace by user name you have set up in your WebAPI settings private const string Pass = ""; // <- Pass in the password that you have set up for the user. NOT AS PLAIN TEXT! Use user secrets instead. private const bool IgnoreSslErrors = true; // <- When you have your certificates in order set this to false. diff --git a/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx b/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx index 7d8a11949..260690f0e 100644 --- a/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx +++ b/src/templates.simple/axosimple.twin/Resources/PlcStringResources.resx @@ -76,14 +76,14 @@ AUTOMAT - src\Examples\PneumaticManipulator.st,140 + src\Examples\PneumaticManipulator.st,157 GROUND - src\Examples\PneumaticManipulator.st,212 + src\Examples\PneumaticManipulator.st,229 SERVICE - src\Examples\PneumaticManipulator.st,266 + src\Examples\PneumaticManipulator.st,283 \ No newline at end of file diff --git a/src/templates.simple/ctrl/Reader.mon b/src/templates.simple/ctrl/Reader.mon new file mode 100644 index 000000000..237603113 --- /dev/null +++ b/src/templates.simple/ctrl/Reader.mon @@ -0,0 +1,5 @@ + +Context.PneumaticManipulator.Components.Citacka._AcquisitionControl +PlcOutputs._10a1_Acquisition_Control_1 +#Context.PneumaticManipulator.Components.Citacka.ReadedData +#Context.PneumaticManipulator.Components.Citacka._Results_128_DataString \ No newline at end of file diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index c7c32d6e7..d2f971baf 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -13,6 +13,7 @@ devDependencies: dependencies: "@ix-ax/axopen.data": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' + "@ax/system-serde": ^2.0.2 variables: APAX_BUILD_ARGS: [ -d ] @@ -27,5 +28,5 @@ scripts: - apax build # Here you will need to set the argumen -t to your plc OP and -i to platfrom you are dowloading to # --default-server-interface is a must if you are using WebAPI - - apax sld --accept-security-disclaimer -t 192.168.0.4 -i .\\bin\\plcsim\\ - -r --default-server-interface + - apax sld --accept-security-disclaimer -t 10.10.10.1 -i .\\bin\\1500\\ -r + --default-server-interface diff --git a/src/templates.simple/ctrl/monitor.mon b/src/templates.simple/ctrl/monitor.mon index fcc8c22d2..90ca631ce 100644 --- a/src/templates.simple/ctrl/monitor.mon +++ b/src/templates.simple/ctrl/monitor.mon @@ -1,8 +1,13 @@ -ContextLogger.LogEntries +#ContextLogger.LogEntries # Context.PneumaticManipulator.ProcessData.Operation #Context.PneumaticManipulator.ProcessData.Data.CreateTask.ErrorDetails #Context.PneumaticManipulator.ProcessData.Shared.CreateTask.ErrorDetails #Context.PneumaticManipulator.ProcessData.Operation.IsInitialized #Context.PneumaticManipulator.ProcessData.Data.CreateTask.IsInitialized -#Context.PneumaticManipulator.ProcessData.Shared.CreateTask.IsInitialized \ No newline at end of file +#Context.PneumaticManipulator.ProcessData.Shared.CreateTask.IsInitialized +#PlcInputs._10a1_Result_Data_128_bytes_1 +#PlcInputs._11a1_DI_8x24VDC_ST_2 +#PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 +Context.PneumaticManipulator.Components.Citacka.ReadedData +Context.PneumaticManipulator.Components.Citacka._Results_128_DataString \ No newline at end of file diff --git a/src/templates.simple/ctrl/snippets/lukas.json b/src/templates.simple/ctrl/snippets/lukas.json new file mode 100644 index 000000000..3cb048bd7 --- /dev/null +++ b/src/templates.simple/ctrl/snippets/lukas.json @@ -0,0 +1,20 @@ +{ + "For Loop": { + "prefix": ["example"], + "body": [ + "${LINE_COMMENT} prevezme nazvo suboru: ${TM_FILENAME/(.*)\\..+$/$1/} ", + "${LINE_COMMENT} prevezme WORKSPACE_NAME: ${WORKSPACE_NAME} ", + "${LINE_COMMENT} prevezme WORKSPACE_FOLDER: ${WORKSPACE_FOLDER} ", + "${LINE_COMMENT} prevezme TM_FILEPATH: ${TM_FILEPATH} ", + "${LINE_COMMENT} prevezme RELATIVE_FILEPATH: ${RELATIVE_FILEPATH} ", + + "${LINE_COMMENT} da navyber zo vstupnych premennych: ${1|BOOL,REAL,INT,DINT|}", + "${LINE_COMMENT} tu istu premennu pouzije aj tu: ${1}", + "${LINE_COMMENT} da navyber zo vstupnych premennych: ${2:nejaky text}", + + "\t$0", + "${LINE_COMMENT}" + ], + "description": "rozne funkcie snippetu" + } + } \ No newline at end of file diff --git a/src/templates.simple/ctrl/src/Components/CgnReader.st b/src/templates.simple/ctrl/src/Components/CgnReader.st new file mode 100644 index 000000000..6c6e1dc80 --- /dev/null +++ b/src/templates.simple/ctrl/src/Components/CgnReader.st @@ -0,0 +1,332 @@ +USING AXOpen.Core; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; +USING System.SerDe; + + +NAMESPACE AXOpen.Cgn + CLASS DatamanReader EXTENDS AXOpen.Core.AxoComponent + VAR PUBLIC + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentHeader()]} + ReadedData : STRING; + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentHeader()]} + Trigger : AxoTask; + {#ix-attr:[ComponentHeader()]} + ReadData : AxoTask; + {#ix-attr:[ComponentHeader()]} + ClearData : AxoTask; + {#ix-attr:[ComponentHeader()]} + Reset : AxoTask; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Control")]} + _AcquisitionControl : CgnReader_Acquisition_Control; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-attr:[ReadOnly()]} + _AcquisitionStatus : CgnReader_AcquisitionStatus; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("ResultsControl")]} + _ResultsControl : CgnReader_ResultsControl; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("ResultsStatus")]} + {#ix-attr:[ReadOnly()]} + _ResultsStatus : CgnReader_ResultsStatus; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("SoftEventControl")]} + {#ix-attr:[ReadOnly()]} + _SoftEventControl : CgnReader_SoftEventControl; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("SoftEventControl")]} + TrainCode : AxoTask; + {#ix-attr:[ComponentDetails("SoftEventControl")]} + TrainFocus : AxoTask; + {#ix-attr:[ComponentDetails("SoftEventControl")]} + TrainBrightness : AxoTask; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("SoftEventStatus")]} + {#ix-attr:[ReadOnly()]} + _SoftEventStatus : CgnReader_SoftEventStatus; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("UserData")]} + {#ix-attr:[ReadOnly()]} + _UserData_128_DataString : STRING; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Results")]} + {#ix-attr:[ReadOnly()]} + _Results_128_DataString : STRING; + + + + (* {#ix-attr:[ComponentDetails("Signals")]} + {#ix-attr:[ReadOnly()]} + {#ix-set:AttributeName = "<#Move work signal#>"} + _MoveWorkSignal : BOOL; + + {#ix-set:MessageText = "<#Move to work position did not succeed.#>"} + {#ix-set:Help = "<#Check the cyclinder that it is free to move, check that the air pressure reaches... and extremity sensor.#>"} + _MoveToWorkNotReached : AXOpen.Messaging.Static.AxoMessenger; + + {#ix-set:MessageText = "<#Move to home position did not succeed.#>"} + {#ix-set:Help = "<#Check the cyclinder that it is free to move, check that the air pressure reaches... and extremity sensor.#>"} + _MoveToHomeNotReached : AXOpen.Messaging.Static.AxoMessenger; + *) + END_VAR + + METHOD PUBLIC Update + VAR_INPUT + parent : IAxoObject; + + Acquisition_Status : ARRAY[0..2] OF BYTE; + Results_Status : BYTE; + Soft_Event_Status : BYTE; + Result_Data_128 : ARRAY[0..135] OF BYTE; + END_VAR + VAR_IN_OUT + Acquisition_Control : BYTE; + Results_Control : BYTE; + //Soft_Event_Control : BYTE; + //User_Data_128 : ARRAY[0..131] OF BYTE; + END_VAR + (*VAR + Data : CgnReader; + END_VAR + + Data.AcquisitionStatus.TriggerReady := Acquisition_Status[0].%X0; + Data.AcquisitionStatus.TriggerAck := Acquisition_Status[0].%X1; + Data.AcquisitionStatus.MissedAcquisition := Acquisition_Status[0].%X3; + Data.AcquisitionStatus.TriggerID := TO_UINT(Acquisition_Status[2]) + (UINT#256 * TO_UINT(Acquisition_Status[1])); //TODO - najst lepsiu konverziu. + + Data.ResultsStatus.Decoding := Results_Status.%X0; + Data.ResultsStatus.DecodingComplete := Results_Status.%X1; + Data.ResultsStatus.ResultsBufferOverrun := Results_Status.%X2; + Data.ResultsStatus.ResultsAvailable := Results_Status.%X3; + Data.ResultsStatus.Error := Results_Status.%X7; + + Data.SoftEventStatus.TrainCodeAcknowledge := Soft_Event_Status.%X0; + Data.SoftEventStatus.TrainMatchStringAcknowledge := Soft_Event_Status.%X1; + Data.SoftEventStatus.TrainFocusAcknowledge := Soft_Event_Status.%X2; + Data.SoftEventStatus.TrainBrightnessAcknowledge := Soft_Event_Status.%X3; + Data.SoftEventStatus.UntrainAcknowledge := Soft_Event_Status.%X4; + Data.SoftEventStatus.Reserved := Soft_Event_Status.%X5; + Data.SoftEventStatus.ExecuteDmccAcknowledge := Soft_Event_Status.%X6; + Data.SoftEventStatus.SetMatchStringAcknowledge := Soft_Event_Status.%X7; +*) + + _AcquisitionStatus.TriggerReady := Acquisition_Status[0].%X0; + _AcquisitionStatus.TriggerAck := Acquisition_Status[0].%X1; + _AcquisitionStatus.MissedAcquisition := Acquisition_Status[0].%X3; + _AcquisitionStatus.TriggerID := TO_UINT(Acquisition_Status[2]) + (UINT#256 * TO_UINT(Acquisition_Status[1])); //TODO - najst lepsiu konverziu. + + _ResultsStatus.Decoding := Results_Status.%X0; + _ResultsStatus.DecodingComplete := Results_Status.%X1; + _ResultsStatus.ResultsBufferOverrun := Results_Status.%X2; + _ResultsStatus.ResultsAvailable := Results_Status.%X3; + _ResultsStatus.Error := Results_Status.%X7; + + _SoftEventStatus.TrainCodeAcknowledge := Soft_Event_Status.%X0; + _SoftEventStatus.TrainMatchStringAcknowledge := Soft_Event_Status.%X1; + _SoftEventStatus.TrainFocusAcknowledge := Soft_Event_Status.%X2; + _SoftEventStatus.TrainBrightnessAcknowledge := Soft_Event_Status.%X3; + _SoftEventStatus.UntrainAcknowledge := Soft_Event_Status.%X4; + _SoftEventStatus.Reserved := Soft_Event_Status.%X5; + _SoftEventStatus.ExecuteDmccAcknowledge := Soft_Event_Status.%X6; + _SoftEventStatus.SetMatchStringAcknowledge := Soft_Event_Status.%X7; + + //_AcquisitionStatus := Data.AcquisitionStatus; + //_ResultsStatus := Data.ResultsStatus; + //_SoftEventStatus := Data.SoftEventStatus; + + + THIS._isManuallyControllable := FALSE; + + THIS.Initialize(parent); + Trigger.Initialize(THIS); + Reset.Initialize(THIS); + ReadData.Initialize(THIS); + ClearData.Initialize(THIS); + TrainCode.Initialize(THIS); + TrainFocus.Initialize(THIS); + TrainBrightness.Initialize(THIS); + + + + IF(Reset.Execute()) THEN + + _AcquisitionControl.TriggerEnable := false; + _AcquisitionControl.Trigger := false; + + Trigger.Restore(); + ReadData.Restore(); + ClearData.Restore(); + + TrainCode.Restore(); + TrainFocus.Restore(); + TrainBrightness.Restore(); + + Reset.DoneWhen(TRUE); + Reset.Restore(); + END_IF; + + IF(Trigger.Execute()) THEN + _AcquisitionControl.Trigger := true; + Trigger.DoneWhen(true); + END_IF; + IF(ReadData.Execute()) THEN + Deserialize(UINT#7, Result_Data_128, ReadedData); + ReadData.DoneWhen(true); + END_IF; + IF(ClearData.Execute()) THEN + ReadedData := ''; + _AcquisitionControl.TriggerEnable := true; + ClearData.DoneWhen(true); + END_IF; + + IF(TrainCode.Execute()) THEN + TrainCode.DoneWhen(true); + END_IF; + + IF(TrainFocus.Execute()) THEN + TrainFocus.DoneWhen(true); + END_IF; + + IF(TrainBrightness.Execute()) THEN + TrainBrightness.DoneWhen(true); + END_IF; + + + Acquisition_Control.%X0 := _AcquisitionControl.TriggerEnable; + Acquisition_Control.%X1 := _AcquisitionControl.Trigger; + + Results_Control.%X0 := _ResultsControl.EnableResultBuffering; + Results_Control.%X1 := _ResultsControl.ResultsAcknowledge; + + + //_ResultsControl := Data.ResultsControl; + //_AcquisitionControl := Data.AcquisitionControl; + + END_METHOD + + METHOD PROTECTED OVERRIDE ManualControl + THIS._isManuallyControllable := true; + END_METHOD + + + METHOD PROTECTED OVERRIDE Restore : IAxoTask + Trigger.Restore(); + Reset.Restore(); + ReadData.Restore(); + ClearData.Restore(); + + TrainCode.Restore(); + TrainFocus.Restore(); + TrainBrightness.Restore(); + + END_METHOD + + END_CLASS +END_NAMESPACE + + + + + +TYPE + CgnReader_IODATA : STRUCT + i_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + i_Results_Status_1 : BYTE; + i_Soft_Event_Control_1 : BYTE; + i_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + + q_Acquisition_Control_1 : BYTE; + q_Results_Control_1 : BYTE; + q_Soft_Event_Control_1 : BYTE; + q_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + END_STRUCT; + + CgnReader: STRUCT + //Data : CgnReader_IODATA; + AcquisitionControl : CgnReader_Acquisition_Control; + AcquisitionStatus : CgnReader_AcquisitionStatus; + ResultsControl : CgnReader_ResultsControl; + ResultsStatus : CgnReader_ResultsStatus; + SoftEventControl : CgnReader_SoftEventControl; + SoftEventStatus : CgnReader_SoftEventStatus; + UserData : CgnReader_UserData_128; + Results : CgnReader_Results_128; + END_STRUCT; + + CgnReader_Acquisition_Control : STRUCT + TriggerEnable : Bool; + Trigger : Bool; + END_STRUCT; + + CgnReader_AcquisitionStatus : STRUCT + TriggerReady : Bool; + TriggerAck : Bool; + MissedAcquisition : Bool; + TriggerID : UInt; + END_STRUCT; + + CgnReader_ResultsControl : STRUCT + EnableResultBuffering : Bool; + ResultsAcknowledge : Bool; + END_STRUCT; + + CgnReader_ResultsStatus : STRUCT + Decoding : Bool; + DecodingComplete : Bool; + ResultsBufferOverrun : Bool; + ResultsAvailable : Bool; + Error : Bool; + END_STRUCT; + + CgnReader_SoftEventControl : STRUCT + TrainCode : Bool; + TrainMatchString : Bool; + TrainFocus : Bool; + TrainBrightness : Bool; + Untrain : Bool; + Reserved : Bool; + ExecuteDmcc : Bool; + SetMatchString : Bool; + END_STRUCT; + + CgnReader_SoftEventStatus : STRUCT + TrainCodeAcknowledge : Bool; + TrainMatchStringAcknowledge : Bool; + TrainFocusAcknowledge : Bool; + TrainBrightnessAcknowledge : Bool; + UntrainAcknowledge : Bool; + Reserved : Bool; + ExecuteDmccAcknowledge : Bool; + SetMatchStringAcknowledge : Bool; + END_STRUCT; + + CgnReader_UserData_128 : STRUCT + UserDataOption :UInt; + UserDataLength: UInt; + DataArray :Array[0..127] of Byte; + DataString : STRING; + END_STRUCT; + + CgnReader_Results_128 : STRUCT + ResultID :UInt; + ResultCode: UInt; + ResultExtended: UInt; + ResultLength: UInt; + DataArray: Array[0..127] of Byte; + DataString : STRING; + END_STRUCT; + +END_TYPE diff --git a/src/templates.simple/ctrl/src/Context.st b/src/templates.simple/ctrl/src/Context.st index 8023a834e..2bd89911c 100644 --- a/src/templates.simple/ctrl/src/Context.st +++ b/src/templates.simple/ctrl/src/Context.st @@ -8,12 +8,14 @@ NAMESPACE axosimple ProcessData : ProcessData; PneumaticManipulator : examples.PneumaticManipulator.CU; Inputs : REF_TO axosimple.Inputs; - Outputs : REF_TO axosimple.Outputs; + Outputs : REF_TO axosimple.Outputs; + PlcInputs :REF_TO PlcInputs; + PlcOutputs :REF_TO PlcOutputs; END_VAR METHOD PROTECTED OVERRIDE Main IF(Inputs <> NULL AND Outputs <> NULL) THEN - PneumaticManipulator.Run(THIS, Inputs^, Outputs^); + PneumaticManipulator.Run(THIS, Inputs^, Outputs^, PlcInputs^, PlcOutputs^ ); END_IF; END_METHOD END_CLASS diff --git a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st index c7fc833c6..b8076a339 100644 --- a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st +++ b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st @@ -15,8 +15,9 @@ NAMESPACE examples.PneumaticManipulator HorizontalCylinder : AXOpen.Pneumatics.Cylinder; VerticalCylinder : AXOpen.Pneumatics.Cylinder; GripperCylinder : AXOpen.Pneumatics.Cylinder; + Citacka : AXOpen.Cgn.DatamanReader; END_VAR - + METHOD PUBLIC Update VAR_INPUT parent : IAxoObject; @@ -24,12 +25,22 @@ NAMESPACE examples.PneumaticManipulator VAR_IN_OUT Inputs : axosimple.Inputs; Outputs : axosimple.Outputs; + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; END_VAR THIS.Initialize(parent); // HERE INITIALIZE YOUR COMPONENTS HorizontalCylinder.Update(THIS, Inputs.B0[0], Inputs.B0[1], Outputs.B0[0], Outputs.B0[1]); - VerticalCylinder.Update(THIS, Inputs.B0[2], Inputs.B0[3], Outputs.B0[2], Outputs.B0[3]); - GripperCylinder.Update(THIS, Inputs.B0[4], Inputs.B0[5], Outputs.B0[4], Outputs.B0[5]); + VerticalCylinder.Update(THIS, Inputs.B0[2], Inputs.B0[3], PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X2, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X3); + GripperCylinder.Update(THIS, PlcInputs._11a1_DI_8x24VDC_ST_2.%X6, PlcInputs._11a1_DI_8x24VDC_ST_2.%X7, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X6, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X7); + Citacka.Update(THIS, PlcInputs._10a1_Acquisition_Status_1, + PlcInputs._10a1_Results_Status_1, + PlcInputs._10a1_Soft_Event_Control_1, + PlcInputs._10a1_Result_Data_128_bytes_1, + PlcOutputs._10a1_Acquisition_Control_1, + PlcOutputs._10a1_Results_Control_1 + ); + END_METHOD END_CLASS @@ -102,18 +113,24 @@ NAMESPACE examples.PneumaticManipulator /// Hardware output structure /// Outputs : axosimple.Outputs; + + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR THIS.Initialize(parent); - THIS.Execute(Inputs, Outputs); + THIS.Execute(Inputs, Outputs, PlcInputs, PlcOutputs); END_METHOD METHOD PRIVATE Execute VAR_IN_OUT Inputs : axosimple.Inputs; Outputs : axosimple.Outputs; + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; END_VAR // Component I/O immange and management handling. - Components.Update(THIS, Inputs, Outputs); + Components.Update(THIS, Inputs, Outputs, PlcInputs, PlcOutputs); // Process data manager ProcessData.Run(THIS); // Handles ground sequence @@ -293,6 +310,7 @@ NAMESPACE examples.PneumaticManipulator components.HorizontalCylinder.ActivateManualControl(); components.VerticalCylinder.ActivateManualControl(); components.GripperCylinder.ActivateManualControl(); + components.Citacka.ActivateManualControl(); END_METHOD END_CLASS diff --git a/src/templates.simple/ctrl/src/IO/CopyInputs.st b/src/templates.simple/ctrl/src/IO/CopyInputs.st new file mode 100644 index 000000000..a1690b2c6 --- /dev/null +++ b/src/templates.simple/ctrl/src/IO/CopyInputs.st @@ -0,0 +1,223 @@ +FUNCTION CopyInputs + VAR_EXTERNAL + HwInputs : HwInputs; + PlcInputs : PlcInputs; + END_VAR + PlcInputs._11a1_DI_8x24VDC_ST_1 := HwInputs._11a1_DI_8x24VDC_ST_1; + PlcInputs._11a1_DI_8x24VDC_ST_2 := HwInputs._11a1_DI_8x24VDC_ST_2; + PlcInputs._12a1_Acquisition_Status_1[0] := HwInputs._12a1_Acquisition_Status_1[0]; + PlcInputs._12a1_Acquisition_Status_1[1] := HwInputs._12a1_Acquisition_Status_1[1]; + PlcInputs._12a1_Acquisition_Status_1[2] := HwInputs._12a1_Acquisition_Status_1[2]; + PlcInputs._12a1_Inspection_Status_1 := HwInputs._12a1_Inspection_Status_1; + PlcInputs._12a1_Command_Control_1 := HwInputs._12a1_Command_Control_1; + PlcInputs._12a1_SoftEvent_Control_1 := HwInputs._12a1_SoftEvent_Control_1; + PlcInputs._12a1_Results_64_bytes_1[0] := HwInputs._12a1_Results_64_bytes_1[0]; + PlcInputs._12a1_Results_64_bytes_1[1] := HwInputs._12a1_Results_64_bytes_1[1]; + PlcInputs._12a1_Results_64_bytes_1[2] := HwInputs._12a1_Results_64_bytes_1[2]; + PlcInputs._12a1_Results_64_bytes_1[3] := HwInputs._12a1_Results_64_bytes_1[3]; + PlcInputs._12a1_Results_64_bytes_1[4] := HwInputs._12a1_Results_64_bytes_1[4]; + PlcInputs._12a1_Results_64_bytes_1[5] := HwInputs._12a1_Results_64_bytes_1[5]; + PlcInputs._12a1_Results_64_bytes_1[6] := HwInputs._12a1_Results_64_bytes_1[6]; + PlcInputs._12a1_Results_64_bytes_1[7] := HwInputs._12a1_Results_64_bytes_1[7]; + PlcInputs._12a1_Results_64_bytes_1[8] := HwInputs._12a1_Results_64_bytes_1[8]; + PlcInputs._12a1_Results_64_bytes_1[9] := HwInputs._12a1_Results_64_bytes_1[9]; + PlcInputs._12a1_Results_64_bytes_1[10] := HwInputs._12a1_Results_64_bytes_1[10]; + PlcInputs._12a1_Results_64_bytes_1[11] := HwInputs._12a1_Results_64_bytes_1[11]; + PlcInputs._12a1_Results_64_bytes_1[12] := HwInputs._12a1_Results_64_bytes_1[12]; + PlcInputs._12a1_Results_64_bytes_1[13] := HwInputs._12a1_Results_64_bytes_1[13]; + PlcInputs._12a1_Results_64_bytes_1[14] := HwInputs._12a1_Results_64_bytes_1[14]; + PlcInputs._12a1_Results_64_bytes_1[15] := HwInputs._12a1_Results_64_bytes_1[15]; + PlcInputs._12a1_Results_64_bytes_1[16] := HwInputs._12a1_Results_64_bytes_1[16]; + PlcInputs._12a1_Results_64_bytes_1[17] := HwInputs._12a1_Results_64_bytes_1[17]; + PlcInputs._12a1_Results_64_bytes_1[18] := HwInputs._12a1_Results_64_bytes_1[18]; + PlcInputs._12a1_Results_64_bytes_1[19] := HwInputs._12a1_Results_64_bytes_1[19]; + PlcInputs._12a1_Results_64_bytes_1[20] := HwInputs._12a1_Results_64_bytes_1[20]; + PlcInputs._12a1_Results_64_bytes_1[21] := HwInputs._12a1_Results_64_bytes_1[21]; + PlcInputs._12a1_Results_64_bytes_1[22] := HwInputs._12a1_Results_64_bytes_1[22]; + PlcInputs._12a1_Results_64_bytes_1[23] := HwInputs._12a1_Results_64_bytes_1[23]; + PlcInputs._12a1_Results_64_bytes_1[24] := HwInputs._12a1_Results_64_bytes_1[24]; + PlcInputs._12a1_Results_64_bytes_1[25] := HwInputs._12a1_Results_64_bytes_1[25]; + PlcInputs._12a1_Results_64_bytes_1[26] := HwInputs._12a1_Results_64_bytes_1[26]; + PlcInputs._12a1_Results_64_bytes_1[27] := HwInputs._12a1_Results_64_bytes_1[27]; + PlcInputs._12a1_Results_64_bytes_1[28] := HwInputs._12a1_Results_64_bytes_1[28]; + PlcInputs._12a1_Results_64_bytes_1[29] := HwInputs._12a1_Results_64_bytes_1[29]; + PlcInputs._12a1_Results_64_bytes_1[30] := HwInputs._12a1_Results_64_bytes_1[30]; + PlcInputs._12a1_Results_64_bytes_1[31] := HwInputs._12a1_Results_64_bytes_1[31]; + PlcInputs._12a1_Results_64_bytes_1[32] := HwInputs._12a1_Results_64_bytes_1[32]; + PlcInputs._12a1_Results_64_bytes_1[33] := HwInputs._12a1_Results_64_bytes_1[33]; + PlcInputs._12a1_Results_64_bytes_1[34] := HwInputs._12a1_Results_64_bytes_1[34]; + PlcInputs._12a1_Results_64_bytes_1[35] := HwInputs._12a1_Results_64_bytes_1[35]; + PlcInputs._12a1_Results_64_bytes_1[36] := HwInputs._12a1_Results_64_bytes_1[36]; + PlcInputs._12a1_Results_64_bytes_1[37] := HwInputs._12a1_Results_64_bytes_1[37]; + PlcInputs._12a1_Results_64_bytes_1[38] := HwInputs._12a1_Results_64_bytes_1[38]; + PlcInputs._12a1_Results_64_bytes_1[39] := HwInputs._12a1_Results_64_bytes_1[39]; + PlcInputs._12a1_Results_64_bytes_1[40] := HwInputs._12a1_Results_64_bytes_1[40]; + PlcInputs._12a1_Results_64_bytes_1[41] := HwInputs._12a1_Results_64_bytes_1[41]; + PlcInputs._12a1_Results_64_bytes_1[42] := HwInputs._12a1_Results_64_bytes_1[42]; + PlcInputs._12a1_Results_64_bytes_1[43] := HwInputs._12a1_Results_64_bytes_1[43]; + PlcInputs._12a1_Results_64_bytes_1[44] := HwInputs._12a1_Results_64_bytes_1[44]; + PlcInputs._12a1_Results_64_bytes_1[45] := HwInputs._12a1_Results_64_bytes_1[45]; + PlcInputs._12a1_Results_64_bytes_1[46] := HwInputs._12a1_Results_64_bytes_1[46]; + PlcInputs._12a1_Results_64_bytes_1[47] := HwInputs._12a1_Results_64_bytes_1[47]; + PlcInputs._12a1_Results_64_bytes_1[48] := HwInputs._12a1_Results_64_bytes_1[48]; + PlcInputs._12a1_Results_64_bytes_1[49] := HwInputs._12a1_Results_64_bytes_1[49]; + PlcInputs._12a1_Results_64_bytes_1[50] := HwInputs._12a1_Results_64_bytes_1[50]; + PlcInputs._12a1_Results_64_bytes_1[51] := HwInputs._12a1_Results_64_bytes_1[51]; + PlcInputs._12a1_Results_64_bytes_1[52] := HwInputs._12a1_Results_64_bytes_1[52]; + PlcInputs._12a1_Results_64_bytes_1[53] := HwInputs._12a1_Results_64_bytes_1[53]; + PlcInputs._12a1_Results_64_bytes_1[54] := HwInputs._12a1_Results_64_bytes_1[54]; + PlcInputs._12a1_Results_64_bytes_1[55] := HwInputs._12a1_Results_64_bytes_1[55]; + PlcInputs._12a1_Results_64_bytes_1[56] := HwInputs._12a1_Results_64_bytes_1[56]; + PlcInputs._12a1_Results_64_bytes_1[57] := HwInputs._12a1_Results_64_bytes_1[57]; + PlcInputs._12a1_Results_64_bytes_1[58] := HwInputs._12a1_Results_64_bytes_1[58]; + PlcInputs._12a1_Results_64_bytes_1[59] := HwInputs._12a1_Results_64_bytes_1[59]; + PlcInputs._12a1_Results_64_bytes_1[60] := HwInputs._12a1_Results_64_bytes_1[60]; + PlcInputs._12a1_Results_64_bytes_1[61] := HwInputs._12a1_Results_64_bytes_1[61]; + PlcInputs._12a1_Results_64_bytes_1[62] := HwInputs._12a1_Results_64_bytes_1[62]; + PlcInputs._12a1_Results_64_bytes_1[63] := HwInputs._12a1_Results_64_bytes_1[63]; + PlcInputs._12a1_Results_64_bytes_1[64] := HwInputs._12a1_Results_64_bytes_1[64]; + PlcInputs._12a1_Results_64_bytes_1[65] := HwInputs._12a1_Results_64_bytes_1[65]; + PlcInputs._12a1_Results_64_bytes_1[66] := HwInputs._12a1_Results_64_bytes_1[66]; + PlcInputs._12a1_Results_64_bytes_1[67] := HwInputs._12a1_Results_64_bytes_1[67]; + PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; + PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; + PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; + PlcInputs._10a1_Results_Status_1 := HwInputs._10a1_Results_Status_1; + PlcInputs._10a1_Soft_Event_Control_1 := HwInputs._10a1_Soft_Event_Control_1; + PlcInputs._10a1_Result_Data_128_bytes_1[0] := HwInputs._10a1_Result_Data_128_bytes_1[0]; + PlcInputs._10a1_Result_Data_128_bytes_1[1] := HwInputs._10a1_Result_Data_128_bytes_1[1]; + PlcInputs._10a1_Result_Data_128_bytes_1[2] := HwInputs._10a1_Result_Data_128_bytes_1[2]; + PlcInputs._10a1_Result_Data_128_bytes_1[3] := HwInputs._10a1_Result_Data_128_bytes_1[3]; + PlcInputs._10a1_Result_Data_128_bytes_1[4] := HwInputs._10a1_Result_Data_128_bytes_1[4]; + PlcInputs._10a1_Result_Data_128_bytes_1[5] := HwInputs._10a1_Result_Data_128_bytes_1[5]; + PlcInputs._10a1_Result_Data_128_bytes_1[6] := HwInputs._10a1_Result_Data_128_bytes_1[6]; + PlcInputs._10a1_Result_Data_128_bytes_1[7] := HwInputs._10a1_Result_Data_128_bytes_1[7]; + PlcInputs._10a1_Result_Data_128_bytes_1[8] := HwInputs._10a1_Result_Data_128_bytes_1[8]; + PlcInputs._10a1_Result_Data_128_bytes_1[9] := HwInputs._10a1_Result_Data_128_bytes_1[9]; + PlcInputs._10a1_Result_Data_128_bytes_1[10] := HwInputs._10a1_Result_Data_128_bytes_1[10]; + PlcInputs._10a1_Result_Data_128_bytes_1[11] := HwInputs._10a1_Result_Data_128_bytes_1[11]; + PlcInputs._10a1_Result_Data_128_bytes_1[12] := HwInputs._10a1_Result_Data_128_bytes_1[12]; + PlcInputs._10a1_Result_Data_128_bytes_1[13] := HwInputs._10a1_Result_Data_128_bytes_1[13]; + PlcInputs._10a1_Result_Data_128_bytes_1[14] := HwInputs._10a1_Result_Data_128_bytes_1[14]; + PlcInputs._10a1_Result_Data_128_bytes_1[15] := HwInputs._10a1_Result_Data_128_bytes_1[15]; + PlcInputs._10a1_Result_Data_128_bytes_1[16] := HwInputs._10a1_Result_Data_128_bytes_1[16]; + PlcInputs._10a1_Result_Data_128_bytes_1[17] := HwInputs._10a1_Result_Data_128_bytes_1[17]; + PlcInputs._10a1_Result_Data_128_bytes_1[18] := HwInputs._10a1_Result_Data_128_bytes_1[18]; + PlcInputs._10a1_Result_Data_128_bytes_1[19] := HwInputs._10a1_Result_Data_128_bytes_1[19]; + PlcInputs._10a1_Result_Data_128_bytes_1[20] := HwInputs._10a1_Result_Data_128_bytes_1[20]; + PlcInputs._10a1_Result_Data_128_bytes_1[21] := HwInputs._10a1_Result_Data_128_bytes_1[21]; + PlcInputs._10a1_Result_Data_128_bytes_1[22] := HwInputs._10a1_Result_Data_128_bytes_1[22]; + PlcInputs._10a1_Result_Data_128_bytes_1[23] := HwInputs._10a1_Result_Data_128_bytes_1[23]; + PlcInputs._10a1_Result_Data_128_bytes_1[24] := HwInputs._10a1_Result_Data_128_bytes_1[24]; + PlcInputs._10a1_Result_Data_128_bytes_1[25] := HwInputs._10a1_Result_Data_128_bytes_1[25]; + PlcInputs._10a1_Result_Data_128_bytes_1[26] := HwInputs._10a1_Result_Data_128_bytes_1[26]; + PlcInputs._10a1_Result_Data_128_bytes_1[27] := HwInputs._10a1_Result_Data_128_bytes_1[27]; + PlcInputs._10a1_Result_Data_128_bytes_1[28] := HwInputs._10a1_Result_Data_128_bytes_1[28]; + PlcInputs._10a1_Result_Data_128_bytes_1[29] := HwInputs._10a1_Result_Data_128_bytes_1[29]; + PlcInputs._10a1_Result_Data_128_bytes_1[30] := HwInputs._10a1_Result_Data_128_bytes_1[30]; + PlcInputs._10a1_Result_Data_128_bytes_1[31] := HwInputs._10a1_Result_Data_128_bytes_1[31]; + PlcInputs._10a1_Result_Data_128_bytes_1[32] := HwInputs._10a1_Result_Data_128_bytes_1[32]; + PlcInputs._10a1_Result_Data_128_bytes_1[33] := HwInputs._10a1_Result_Data_128_bytes_1[33]; + PlcInputs._10a1_Result_Data_128_bytes_1[34] := HwInputs._10a1_Result_Data_128_bytes_1[34]; + PlcInputs._10a1_Result_Data_128_bytes_1[35] := HwInputs._10a1_Result_Data_128_bytes_1[35]; + PlcInputs._10a1_Result_Data_128_bytes_1[36] := HwInputs._10a1_Result_Data_128_bytes_1[36]; + PlcInputs._10a1_Result_Data_128_bytes_1[37] := HwInputs._10a1_Result_Data_128_bytes_1[37]; + PlcInputs._10a1_Result_Data_128_bytes_1[38] := HwInputs._10a1_Result_Data_128_bytes_1[38]; + PlcInputs._10a1_Result_Data_128_bytes_1[39] := HwInputs._10a1_Result_Data_128_bytes_1[39]; + PlcInputs._10a1_Result_Data_128_bytes_1[40] := HwInputs._10a1_Result_Data_128_bytes_1[40]; + PlcInputs._10a1_Result_Data_128_bytes_1[41] := HwInputs._10a1_Result_Data_128_bytes_1[41]; + PlcInputs._10a1_Result_Data_128_bytes_1[42] := HwInputs._10a1_Result_Data_128_bytes_1[42]; + PlcInputs._10a1_Result_Data_128_bytes_1[43] := HwInputs._10a1_Result_Data_128_bytes_1[43]; + PlcInputs._10a1_Result_Data_128_bytes_1[44] := HwInputs._10a1_Result_Data_128_bytes_1[44]; + PlcInputs._10a1_Result_Data_128_bytes_1[45] := HwInputs._10a1_Result_Data_128_bytes_1[45]; + PlcInputs._10a1_Result_Data_128_bytes_1[46] := HwInputs._10a1_Result_Data_128_bytes_1[46]; + PlcInputs._10a1_Result_Data_128_bytes_1[47] := HwInputs._10a1_Result_Data_128_bytes_1[47]; + PlcInputs._10a1_Result_Data_128_bytes_1[48] := HwInputs._10a1_Result_Data_128_bytes_1[48]; + PlcInputs._10a1_Result_Data_128_bytes_1[49] := HwInputs._10a1_Result_Data_128_bytes_1[49]; + PlcInputs._10a1_Result_Data_128_bytes_1[50] := HwInputs._10a1_Result_Data_128_bytes_1[50]; + PlcInputs._10a1_Result_Data_128_bytes_1[51] := HwInputs._10a1_Result_Data_128_bytes_1[51]; + PlcInputs._10a1_Result_Data_128_bytes_1[52] := HwInputs._10a1_Result_Data_128_bytes_1[52]; + PlcInputs._10a1_Result_Data_128_bytes_1[53] := HwInputs._10a1_Result_Data_128_bytes_1[53]; + PlcInputs._10a1_Result_Data_128_bytes_1[54] := HwInputs._10a1_Result_Data_128_bytes_1[54]; + PlcInputs._10a1_Result_Data_128_bytes_1[55] := HwInputs._10a1_Result_Data_128_bytes_1[55]; + PlcInputs._10a1_Result_Data_128_bytes_1[56] := HwInputs._10a1_Result_Data_128_bytes_1[56]; + PlcInputs._10a1_Result_Data_128_bytes_1[57] := HwInputs._10a1_Result_Data_128_bytes_1[57]; + PlcInputs._10a1_Result_Data_128_bytes_1[58] := HwInputs._10a1_Result_Data_128_bytes_1[58]; + PlcInputs._10a1_Result_Data_128_bytes_1[59] := HwInputs._10a1_Result_Data_128_bytes_1[59]; + PlcInputs._10a1_Result_Data_128_bytes_1[60] := HwInputs._10a1_Result_Data_128_bytes_1[60]; + PlcInputs._10a1_Result_Data_128_bytes_1[61] := HwInputs._10a1_Result_Data_128_bytes_1[61]; + PlcInputs._10a1_Result_Data_128_bytes_1[62] := HwInputs._10a1_Result_Data_128_bytes_1[62]; + PlcInputs._10a1_Result_Data_128_bytes_1[63] := HwInputs._10a1_Result_Data_128_bytes_1[63]; + PlcInputs._10a1_Result_Data_128_bytes_1[64] := HwInputs._10a1_Result_Data_128_bytes_1[64]; + PlcInputs._10a1_Result_Data_128_bytes_1[65] := HwInputs._10a1_Result_Data_128_bytes_1[65]; + PlcInputs._10a1_Result_Data_128_bytes_1[66] := HwInputs._10a1_Result_Data_128_bytes_1[66]; + PlcInputs._10a1_Result_Data_128_bytes_1[67] := HwInputs._10a1_Result_Data_128_bytes_1[67]; + PlcInputs._10a1_Result_Data_128_bytes_1[68] := HwInputs._10a1_Result_Data_128_bytes_1[68]; + PlcInputs._10a1_Result_Data_128_bytes_1[69] := HwInputs._10a1_Result_Data_128_bytes_1[69]; + PlcInputs._10a1_Result_Data_128_bytes_1[70] := HwInputs._10a1_Result_Data_128_bytes_1[70]; + PlcInputs._10a1_Result_Data_128_bytes_1[71] := HwInputs._10a1_Result_Data_128_bytes_1[71]; + PlcInputs._10a1_Result_Data_128_bytes_1[72] := HwInputs._10a1_Result_Data_128_bytes_1[72]; + PlcInputs._10a1_Result_Data_128_bytes_1[73] := HwInputs._10a1_Result_Data_128_bytes_1[73]; + PlcInputs._10a1_Result_Data_128_bytes_1[74] := HwInputs._10a1_Result_Data_128_bytes_1[74]; + PlcInputs._10a1_Result_Data_128_bytes_1[75] := HwInputs._10a1_Result_Data_128_bytes_1[75]; + PlcInputs._10a1_Result_Data_128_bytes_1[76] := HwInputs._10a1_Result_Data_128_bytes_1[76]; + PlcInputs._10a1_Result_Data_128_bytes_1[77] := HwInputs._10a1_Result_Data_128_bytes_1[77]; + PlcInputs._10a1_Result_Data_128_bytes_1[78] := HwInputs._10a1_Result_Data_128_bytes_1[78]; + PlcInputs._10a1_Result_Data_128_bytes_1[79] := HwInputs._10a1_Result_Data_128_bytes_1[79]; + PlcInputs._10a1_Result_Data_128_bytes_1[80] := HwInputs._10a1_Result_Data_128_bytes_1[80]; + PlcInputs._10a1_Result_Data_128_bytes_1[81] := HwInputs._10a1_Result_Data_128_bytes_1[81]; + PlcInputs._10a1_Result_Data_128_bytes_1[82] := HwInputs._10a1_Result_Data_128_bytes_1[82]; + PlcInputs._10a1_Result_Data_128_bytes_1[83] := HwInputs._10a1_Result_Data_128_bytes_1[83]; + PlcInputs._10a1_Result_Data_128_bytes_1[84] := HwInputs._10a1_Result_Data_128_bytes_1[84]; + PlcInputs._10a1_Result_Data_128_bytes_1[85] := HwInputs._10a1_Result_Data_128_bytes_1[85]; + PlcInputs._10a1_Result_Data_128_bytes_1[86] := HwInputs._10a1_Result_Data_128_bytes_1[86]; + PlcInputs._10a1_Result_Data_128_bytes_1[87] := HwInputs._10a1_Result_Data_128_bytes_1[87]; + PlcInputs._10a1_Result_Data_128_bytes_1[88] := HwInputs._10a1_Result_Data_128_bytes_1[88]; + PlcInputs._10a1_Result_Data_128_bytes_1[89] := HwInputs._10a1_Result_Data_128_bytes_1[89]; + PlcInputs._10a1_Result_Data_128_bytes_1[90] := HwInputs._10a1_Result_Data_128_bytes_1[90]; + PlcInputs._10a1_Result_Data_128_bytes_1[91] := HwInputs._10a1_Result_Data_128_bytes_1[91]; + PlcInputs._10a1_Result_Data_128_bytes_1[92] := HwInputs._10a1_Result_Data_128_bytes_1[92]; + PlcInputs._10a1_Result_Data_128_bytes_1[93] := HwInputs._10a1_Result_Data_128_bytes_1[93]; + PlcInputs._10a1_Result_Data_128_bytes_1[94] := HwInputs._10a1_Result_Data_128_bytes_1[94]; + PlcInputs._10a1_Result_Data_128_bytes_1[95] := HwInputs._10a1_Result_Data_128_bytes_1[95]; + PlcInputs._10a1_Result_Data_128_bytes_1[96] := HwInputs._10a1_Result_Data_128_bytes_1[96]; + PlcInputs._10a1_Result_Data_128_bytes_1[97] := HwInputs._10a1_Result_Data_128_bytes_1[97]; + PlcInputs._10a1_Result_Data_128_bytes_1[98] := HwInputs._10a1_Result_Data_128_bytes_1[98]; + PlcInputs._10a1_Result_Data_128_bytes_1[99] := HwInputs._10a1_Result_Data_128_bytes_1[99]; + PlcInputs._10a1_Result_Data_128_bytes_1[100] := HwInputs._10a1_Result_Data_128_bytes_1[100]; + PlcInputs._10a1_Result_Data_128_bytes_1[101] := HwInputs._10a1_Result_Data_128_bytes_1[101]; + PlcInputs._10a1_Result_Data_128_bytes_1[102] := HwInputs._10a1_Result_Data_128_bytes_1[102]; + PlcInputs._10a1_Result_Data_128_bytes_1[103] := HwInputs._10a1_Result_Data_128_bytes_1[103]; + PlcInputs._10a1_Result_Data_128_bytes_1[104] := HwInputs._10a1_Result_Data_128_bytes_1[104]; + PlcInputs._10a1_Result_Data_128_bytes_1[105] := HwInputs._10a1_Result_Data_128_bytes_1[105]; + PlcInputs._10a1_Result_Data_128_bytes_1[106] := HwInputs._10a1_Result_Data_128_bytes_1[106]; + PlcInputs._10a1_Result_Data_128_bytes_1[107] := HwInputs._10a1_Result_Data_128_bytes_1[107]; + PlcInputs._10a1_Result_Data_128_bytes_1[108] := HwInputs._10a1_Result_Data_128_bytes_1[108]; + PlcInputs._10a1_Result_Data_128_bytes_1[109] := HwInputs._10a1_Result_Data_128_bytes_1[109]; + PlcInputs._10a1_Result_Data_128_bytes_1[110] := HwInputs._10a1_Result_Data_128_bytes_1[110]; + PlcInputs._10a1_Result_Data_128_bytes_1[111] := HwInputs._10a1_Result_Data_128_bytes_1[111]; + PlcInputs._10a1_Result_Data_128_bytes_1[112] := HwInputs._10a1_Result_Data_128_bytes_1[112]; + PlcInputs._10a1_Result_Data_128_bytes_1[113] := HwInputs._10a1_Result_Data_128_bytes_1[113]; + PlcInputs._10a1_Result_Data_128_bytes_1[114] := HwInputs._10a1_Result_Data_128_bytes_1[114]; + PlcInputs._10a1_Result_Data_128_bytes_1[115] := HwInputs._10a1_Result_Data_128_bytes_1[115]; + PlcInputs._10a1_Result_Data_128_bytes_1[116] := HwInputs._10a1_Result_Data_128_bytes_1[116]; + PlcInputs._10a1_Result_Data_128_bytes_1[117] := HwInputs._10a1_Result_Data_128_bytes_1[117]; + PlcInputs._10a1_Result_Data_128_bytes_1[118] := HwInputs._10a1_Result_Data_128_bytes_1[118]; + PlcInputs._10a1_Result_Data_128_bytes_1[119] := HwInputs._10a1_Result_Data_128_bytes_1[119]; + PlcInputs._10a1_Result_Data_128_bytes_1[120] := HwInputs._10a1_Result_Data_128_bytes_1[120]; + PlcInputs._10a1_Result_Data_128_bytes_1[121] := HwInputs._10a1_Result_Data_128_bytes_1[121]; + PlcInputs._10a1_Result_Data_128_bytes_1[122] := HwInputs._10a1_Result_Data_128_bytes_1[122]; + PlcInputs._10a1_Result_Data_128_bytes_1[123] := HwInputs._10a1_Result_Data_128_bytes_1[123]; + PlcInputs._10a1_Result_Data_128_bytes_1[124] := HwInputs._10a1_Result_Data_128_bytes_1[124]; + PlcInputs._10a1_Result_Data_128_bytes_1[125] := HwInputs._10a1_Result_Data_128_bytes_1[125]; + PlcInputs._10a1_Result_Data_128_bytes_1[126] := HwInputs._10a1_Result_Data_128_bytes_1[126]; + PlcInputs._10a1_Result_Data_128_bytes_1[127] := HwInputs._10a1_Result_Data_128_bytes_1[127]; + PlcInputs._10a1_Result_Data_128_bytes_1[128] := HwInputs._10a1_Result_Data_128_bytes_1[128]; + PlcInputs._10a1_Result_Data_128_bytes_1[129] := HwInputs._10a1_Result_Data_128_bytes_1[129]; + PlcInputs._10a1_Result_Data_128_bytes_1[130] := HwInputs._10a1_Result_Data_128_bytes_1[130]; + PlcInputs._10a1_Result_Data_128_bytes_1[131] := HwInputs._10a1_Result_Data_128_bytes_1[131]; + PlcInputs._10a1_Result_Data_128_bytes_1[132] := HwInputs._10a1_Result_Data_128_bytes_1[132]; + PlcInputs._10a1_Result_Data_128_bytes_1[133] := HwInputs._10a1_Result_Data_128_bytes_1[133]; + PlcInputs._10a1_Result_Data_128_bytes_1[134] := HwInputs._10a1_Result_Data_128_bytes_1[134]; + PlcInputs._10a1_Result_Data_128_bytes_1[135] := HwInputs._10a1_Result_Data_128_bytes_1[135]; +END_FUNCTION diff --git a/src/templates.simple/ctrl/src/IO/CopyOutputs.st b/src/templates.simple/ctrl/src/IO/CopyOutputs.st new file mode 100644 index 000000000..caf897994 --- /dev/null +++ b/src/templates.simple/ctrl/src/IO/CopyOutputs.st @@ -0,0 +1,210 @@ +FUNCTION CopyOutputs + VAR_EXTERNAL + HwOutputs : HwOutputs; + PlcOutputs : PlcOutputs; + END_VAR + HwOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1; + HwOutputs._12a1_Acquisition_Control_1 := PlcOutputs._12a1_Acquisition_Control_1; + HwOutputs._12a1_Inspection_Control_1 := PlcOutputs._12a1_Inspection_Control_1; + HwOutputs._12a1_Command_Control_1 := PlcOutputs._12a1_Command_Control_1; + HwOutputs._12a1_SoftEvent_Control_1 := PlcOutputs._12a1_SoftEvent_Control_1; + HwOutputs._12a1_User_Data_64_bytes_1[0] := PlcOutputs._12a1_User_Data_64_bytes_1[0]; + HwOutputs._12a1_User_Data_64_bytes_1[1] := PlcOutputs._12a1_User_Data_64_bytes_1[1]; + HwOutputs._12a1_User_Data_64_bytes_1[2] := PlcOutputs._12a1_User_Data_64_bytes_1[2]; + HwOutputs._12a1_User_Data_64_bytes_1[3] := PlcOutputs._12a1_User_Data_64_bytes_1[3]; + HwOutputs._12a1_User_Data_64_bytes_1[4] := PlcOutputs._12a1_User_Data_64_bytes_1[4]; + HwOutputs._12a1_User_Data_64_bytes_1[5] := PlcOutputs._12a1_User_Data_64_bytes_1[5]; + HwOutputs._12a1_User_Data_64_bytes_1[6] := PlcOutputs._12a1_User_Data_64_bytes_1[6]; + HwOutputs._12a1_User_Data_64_bytes_1[7] := PlcOutputs._12a1_User_Data_64_bytes_1[7]; + HwOutputs._12a1_User_Data_64_bytes_1[8] := PlcOutputs._12a1_User_Data_64_bytes_1[8]; + HwOutputs._12a1_User_Data_64_bytes_1[9] := PlcOutputs._12a1_User_Data_64_bytes_1[9]; + HwOutputs._12a1_User_Data_64_bytes_1[10] := PlcOutputs._12a1_User_Data_64_bytes_1[10]; + HwOutputs._12a1_User_Data_64_bytes_1[11] := PlcOutputs._12a1_User_Data_64_bytes_1[11]; + HwOutputs._12a1_User_Data_64_bytes_1[12] := PlcOutputs._12a1_User_Data_64_bytes_1[12]; + HwOutputs._12a1_User_Data_64_bytes_1[13] := PlcOutputs._12a1_User_Data_64_bytes_1[13]; + HwOutputs._12a1_User_Data_64_bytes_1[14] := PlcOutputs._12a1_User_Data_64_bytes_1[14]; + HwOutputs._12a1_User_Data_64_bytes_1[15] := PlcOutputs._12a1_User_Data_64_bytes_1[15]; + HwOutputs._12a1_User_Data_64_bytes_1[16] := PlcOutputs._12a1_User_Data_64_bytes_1[16]; + HwOutputs._12a1_User_Data_64_bytes_1[17] := PlcOutputs._12a1_User_Data_64_bytes_1[17]; + HwOutputs._12a1_User_Data_64_bytes_1[18] := PlcOutputs._12a1_User_Data_64_bytes_1[18]; + HwOutputs._12a1_User_Data_64_bytes_1[19] := PlcOutputs._12a1_User_Data_64_bytes_1[19]; + HwOutputs._12a1_User_Data_64_bytes_1[20] := PlcOutputs._12a1_User_Data_64_bytes_1[20]; + HwOutputs._12a1_User_Data_64_bytes_1[21] := PlcOutputs._12a1_User_Data_64_bytes_1[21]; + HwOutputs._12a1_User_Data_64_bytes_1[22] := PlcOutputs._12a1_User_Data_64_bytes_1[22]; + HwOutputs._12a1_User_Data_64_bytes_1[23] := PlcOutputs._12a1_User_Data_64_bytes_1[23]; + HwOutputs._12a1_User_Data_64_bytes_1[24] := PlcOutputs._12a1_User_Data_64_bytes_1[24]; + HwOutputs._12a1_User_Data_64_bytes_1[25] := PlcOutputs._12a1_User_Data_64_bytes_1[25]; + HwOutputs._12a1_User_Data_64_bytes_1[26] := PlcOutputs._12a1_User_Data_64_bytes_1[26]; + HwOutputs._12a1_User_Data_64_bytes_1[27] := PlcOutputs._12a1_User_Data_64_bytes_1[27]; + HwOutputs._12a1_User_Data_64_bytes_1[28] := PlcOutputs._12a1_User_Data_64_bytes_1[28]; + HwOutputs._12a1_User_Data_64_bytes_1[29] := PlcOutputs._12a1_User_Data_64_bytes_1[29]; + HwOutputs._12a1_User_Data_64_bytes_1[30] := PlcOutputs._12a1_User_Data_64_bytes_1[30]; + HwOutputs._12a1_User_Data_64_bytes_1[31] := PlcOutputs._12a1_User_Data_64_bytes_1[31]; + HwOutputs._12a1_User_Data_64_bytes_1[32] := PlcOutputs._12a1_User_Data_64_bytes_1[32]; + HwOutputs._12a1_User_Data_64_bytes_1[33] := PlcOutputs._12a1_User_Data_64_bytes_1[33]; + HwOutputs._12a1_User_Data_64_bytes_1[34] := PlcOutputs._12a1_User_Data_64_bytes_1[34]; + HwOutputs._12a1_User_Data_64_bytes_1[35] := PlcOutputs._12a1_User_Data_64_bytes_1[35]; + HwOutputs._12a1_User_Data_64_bytes_1[36] := PlcOutputs._12a1_User_Data_64_bytes_1[36]; + HwOutputs._12a1_User_Data_64_bytes_1[37] := PlcOutputs._12a1_User_Data_64_bytes_1[37]; + HwOutputs._12a1_User_Data_64_bytes_1[38] := PlcOutputs._12a1_User_Data_64_bytes_1[38]; + HwOutputs._12a1_User_Data_64_bytes_1[39] := PlcOutputs._12a1_User_Data_64_bytes_1[39]; + HwOutputs._12a1_User_Data_64_bytes_1[40] := PlcOutputs._12a1_User_Data_64_bytes_1[40]; + HwOutputs._12a1_User_Data_64_bytes_1[41] := PlcOutputs._12a1_User_Data_64_bytes_1[41]; + HwOutputs._12a1_User_Data_64_bytes_1[42] := PlcOutputs._12a1_User_Data_64_bytes_1[42]; + HwOutputs._12a1_User_Data_64_bytes_1[43] := PlcOutputs._12a1_User_Data_64_bytes_1[43]; + HwOutputs._12a1_User_Data_64_bytes_1[44] := PlcOutputs._12a1_User_Data_64_bytes_1[44]; + HwOutputs._12a1_User_Data_64_bytes_1[45] := PlcOutputs._12a1_User_Data_64_bytes_1[45]; + HwOutputs._12a1_User_Data_64_bytes_1[46] := PlcOutputs._12a1_User_Data_64_bytes_1[46]; + HwOutputs._12a1_User_Data_64_bytes_1[47] := PlcOutputs._12a1_User_Data_64_bytes_1[47]; + HwOutputs._12a1_User_Data_64_bytes_1[48] := PlcOutputs._12a1_User_Data_64_bytes_1[48]; + HwOutputs._12a1_User_Data_64_bytes_1[49] := PlcOutputs._12a1_User_Data_64_bytes_1[49]; + HwOutputs._12a1_User_Data_64_bytes_1[50] := PlcOutputs._12a1_User_Data_64_bytes_1[50]; + HwOutputs._12a1_User_Data_64_bytes_1[51] := PlcOutputs._12a1_User_Data_64_bytes_1[51]; + HwOutputs._12a1_User_Data_64_bytes_1[52] := PlcOutputs._12a1_User_Data_64_bytes_1[52]; + HwOutputs._12a1_User_Data_64_bytes_1[53] := PlcOutputs._12a1_User_Data_64_bytes_1[53]; + HwOutputs._12a1_User_Data_64_bytes_1[54] := PlcOutputs._12a1_User_Data_64_bytes_1[54]; + HwOutputs._12a1_User_Data_64_bytes_1[55] := PlcOutputs._12a1_User_Data_64_bytes_1[55]; + HwOutputs._12a1_User_Data_64_bytes_1[56] := PlcOutputs._12a1_User_Data_64_bytes_1[56]; + HwOutputs._12a1_User_Data_64_bytes_1[57] := PlcOutputs._12a1_User_Data_64_bytes_1[57]; + HwOutputs._12a1_User_Data_64_bytes_1[58] := PlcOutputs._12a1_User_Data_64_bytes_1[58]; + HwOutputs._12a1_User_Data_64_bytes_1[59] := PlcOutputs._12a1_User_Data_64_bytes_1[59]; + HwOutputs._12a1_User_Data_64_bytes_1[60] := PlcOutputs._12a1_User_Data_64_bytes_1[60]; + HwOutputs._12a1_User_Data_64_bytes_1[61] := PlcOutputs._12a1_User_Data_64_bytes_1[61]; + HwOutputs._12a1_User_Data_64_bytes_1[62] := PlcOutputs._12a1_User_Data_64_bytes_1[62]; + HwOutputs._12a1_User_Data_64_bytes_1[63] := PlcOutputs._12a1_User_Data_64_bytes_1[63]; + HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; + HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; + HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; + HwOutputs._10a1_User_Data_128_bytes_1[0] := PlcOutputs._10a1_User_Data_128_bytes_1[0]; + HwOutputs._10a1_User_Data_128_bytes_1[1] := PlcOutputs._10a1_User_Data_128_bytes_1[1]; + HwOutputs._10a1_User_Data_128_bytes_1[2] := PlcOutputs._10a1_User_Data_128_bytes_1[2]; + HwOutputs._10a1_User_Data_128_bytes_1[3] := PlcOutputs._10a1_User_Data_128_bytes_1[3]; + HwOutputs._10a1_User_Data_128_bytes_1[4] := PlcOutputs._10a1_User_Data_128_bytes_1[4]; + HwOutputs._10a1_User_Data_128_bytes_1[5] := PlcOutputs._10a1_User_Data_128_bytes_1[5]; + HwOutputs._10a1_User_Data_128_bytes_1[6] := PlcOutputs._10a1_User_Data_128_bytes_1[6]; + HwOutputs._10a1_User_Data_128_bytes_1[7] := PlcOutputs._10a1_User_Data_128_bytes_1[7]; + HwOutputs._10a1_User_Data_128_bytes_1[8] := PlcOutputs._10a1_User_Data_128_bytes_1[8]; + HwOutputs._10a1_User_Data_128_bytes_1[9] := PlcOutputs._10a1_User_Data_128_bytes_1[9]; + HwOutputs._10a1_User_Data_128_bytes_1[10] := PlcOutputs._10a1_User_Data_128_bytes_1[10]; + HwOutputs._10a1_User_Data_128_bytes_1[11] := PlcOutputs._10a1_User_Data_128_bytes_1[11]; + HwOutputs._10a1_User_Data_128_bytes_1[12] := PlcOutputs._10a1_User_Data_128_bytes_1[12]; + HwOutputs._10a1_User_Data_128_bytes_1[13] := PlcOutputs._10a1_User_Data_128_bytes_1[13]; + HwOutputs._10a1_User_Data_128_bytes_1[14] := PlcOutputs._10a1_User_Data_128_bytes_1[14]; + HwOutputs._10a1_User_Data_128_bytes_1[15] := PlcOutputs._10a1_User_Data_128_bytes_1[15]; + HwOutputs._10a1_User_Data_128_bytes_1[16] := PlcOutputs._10a1_User_Data_128_bytes_1[16]; + HwOutputs._10a1_User_Data_128_bytes_1[17] := PlcOutputs._10a1_User_Data_128_bytes_1[17]; + HwOutputs._10a1_User_Data_128_bytes_1[18] := PlcOutputs._10a1_User_Data_128_bytes_1[18]; + HwOutputs._10a1_User_Data_128_bytes_1[19] := PlcOutputs._10a1_User_Data_128_bytes_1[19]; + HwOutputs._10a1_User_Data_128_bytes_1[20] := PlcOutputs._10a1_User_Data_128_bytes_1[20]; + HwOutputs._10a1_User_Data_128_bytes_1[21] := PlcOutputs._10a1_User_Data_128_bytes_1[21]; + HwOutputs._10a1_User_Data_128_bytes_1[22] := PlcOutputs._10a1_User_Data_128_bytes_1[22]; + HwOutputs._10a1_User_Data_128_bytes_1[23] := PlcOutputs._10a1_User_Data_128_bytes_1[23]; + HwOutputs._10a1_User_Data_128_bytes_1[24] := PlcOutputs._10a1_User_Data_128_bytes_1[24]; + HwOutputs._10a1_User_Data_128_bytes_1[25] := PlcOutputs._10a1_User_Data_128_bytes_1[25]; + HwOutputs._10a1_User_Data_128_bytes_1[26] := PlcOutputs._10a1_User_Data_128_bytes_1[26]; + HwOutputs._10a1_User_Data_128_bytes_1[27] := PlcOutputs._10a1_User_Data_128_bytes_1[27]; + HwOutputs._10a1_User_Data_128_bytes_1[28] := PlcOutputs._10a1_User_Data_128_bytes_1[28]; + HwOutputs._10a1_User_Data_128_bytes_1[29] := PlcOutputs._10a1_User_Data_128_bytes_1[29]; + HwOutputs._10a1_User_Data_128_bytes_1[30] := PlcOutputs._10a1_User_Data_128_bytes_1[30]; + HwOutputs._10a1_User_Data_128_bytes_1[31] := PlcOutputs._10a1_User_Data_128_bytes_1[31]; + HwOutputs._10a1_User_Data_128_bytes_1[32] := PlcOutputs._10a1_User_Data_128_bytes_1[32]; + HwOutputs._10a1_User_Data_128_bytes_1[33] := PlcOutputs._10a1_User_Data_128_bytes_1[33]; + HwOutputs._10a1_User_Data_128_bytes_1[34] := PlcOutputs._10a1_User_Data_128_bytes_1[34]; + HwOutputs._10a1_User_Data_128_bytes_1[35] := PlcOutputs._10a1_User_Data_128_bytes_1[35]; + HwOutputs._10a1_User_Data_128_bytes_1[36] := PlcOutputs._10a1_User_Data_128_bytes_1[36]; + HwOutputs._10a1_User_Data_128_bytes_1[37] := PlcOutputs._10a1_User_Data_128_bytes_1[37]; + HwOutputs._10a1_User_Data_128_bytes_1[38] := PlcOutputs._10a1_User_Data_128_bytes_1[38]; + HwOutputs._10a1_User_Data_128_bytes_1[39] := PlcOutputs._10a1_User_Data_128_bytes_1[39]; + HwOutputs._10a1_User_Data_128_bytes_1[40] := PlcOutputs._10a1_User_Data_128_bytes_1[40]; + HwOutputs._10a1_User_Data_128_bytes_1[41] := PlcOutputs._10a1_User_Data_128_bytes_1[41]; + HwOutputs._10a1_User_Data_128_bytes_1[42] := PlcOutputs._10a1_User_Data_128_bytes_1[42]; + HwOutputs._10a1_User_Data_128_bytes_1[43] := PlcOutputs._10a1_User_Data_128_bytes_1[43]; + HwOutputs._10a1_User_Data_128_bytes_1[44] := PlcOutputs._10a1_User_Data_128_bytes_1[44]; + HwOutputs._10a1_User_Data_128_bytes_1[45] := PlcOutputs._10a1_User_Data_128_bytes_1[45]; + HwOutputs._10a1_User_Data_128_bytes_1[46] := PlcOutputs._10a1_User_Data_128_bytes_1[46]; + HwOutputs._10a1_User_Data_128_bytes_1[47] := PlcOutputs._10a1_User_Data_128_bytes_1[47]; + HwOutputs._10a1_User_Data_128_bytes_1[48] := PlcOutputs._10a1_User_Data_128_bytes_1[48]; + HwOutputs._10a1_User_Data_128_bytes_1[49] := PlcOutputs._10a1_User_Data_128_bytes_1[49]; + HwOutputs._10a1_User_Data_128_bytes_1[50] := PlcOutputs._10a1_User_Data_128_bytes_1[50]; + HwOutputs._10a1_User_Data_128_bytes_1[51] := PlcOutputs._10a1_User_Data_128_bytes_1[51]; + HwOutputs._10a1_User_Data_128_bytes_1[52] := PlcOutputs._10a1_User_Data_128_bytes_1[52]; + HwOutputs._10a1_User_Data_128_bytes_1[53] := PlcOutputs._10a1_User_Data_128_bytes_1[53]; + HwOutputs._10a1_User_Data_128_bytes_1[54] := PlcOutputs._10a1_User_Data_128_bytes_1[54]; + HwOutputs._10a1_User_Data_128_bytes_1[55] := PlcOutputs._10a1_User_Data_128_bytes_1[55]; + HwOutputs._10a1_User_Data_128_bytes_1[56] := PlcOutputs._10a1_User_Data_128_bytes_1[56]; + HwOutputs._10a1_User_Data_128_bytes_1[57] := PlcOutputs._10a1_User_Data_128_bytes_1[57]; + HwOutputs._10a1_User_Data_128_bytes_1[58] := PlcOutputs._10a1_User_Data_128_bytes_1[58]; + HwOutputs._10a1_User_Data_128_bytes_1[59] := PlcOutputs._10a1_User_Data_128_bytes_1[59]; + HwOutputs._10a1_User_Data_128_bytes_1[60] := PlcOutputs._10a1_User_Data_128_bytes_1[60]; + HwOutputs._10a1_User_Data_128_bytes_1[61] := PlcOutputs._10a1_User_Data_128_bytes_1[61]; + HwOutputs._10a1_User_Data_128_bytes_1[62] := PlcOutputs._10a1_User_Data_128_bytes_1[62]; + HwOutputs._10a1_User_Data_128_bytes_1[63] := PlcOutputs._10a1_User_Data_128_bytes_1[63]; + HwOutputs._10a1_User_Data_128_bytes_1[64] := PlcOutputs._10a1_User_Data_128_bytes_1[64]; + HwOutputs._10a1_User_Data_128_bytes_1[65] := PlcOutputs._10a1_User_Data_128_bytes_1[65]; + HwOutputs._10a1_User_Data_128_bytes_1[66] := PlcOutputs._10a1_User_Data_128_bytes_1[66]; + HwOutputs._10a1_User_Data_128_bytes_1[67] := PlcOutputs._10a1_User_Data_128_bytes_1[67]; + HwOutputs._10a1_User_Data_128_bytes_1[68] := PlcOutputs._10a1_User_Data_128_bytes_1[68]; + HwOutputs._10a1_User_Data_128_bytes_1[69] := PlcOutputs._10a1_User_Data_128_bytes_1[69]; + HwOutputs._10a1_User_Data_128_bytes_1[70] := PlcOutputs._10a1_User_Data_128_bytes_1[70]; + HwOutputs._10a1_User_Data_128_bytes_1[71] := PlcOutputs._10a1_User_Data_128_bytes_1[71]; + HwOutputs._10a1_User_Data_128_bytes_1[72] := PlcOutputs._10a1_User_Data_128_bytes_1[72]; + HwOutputs._10a1_User_Data_128_bytes_1[73] := PlcOutputs._10a1_User_Data_128_bytes_1[73]; + HwOutputs._10a1_User_Data_128_bytes_1[74] := PlcOutputs._10a1_User_Data_128_bytes_1[74]; + HwOutputs._10a1_User_Data_128_bytes_1[75] := PlcOutputs._10a1_User_Data_128_bytes_1[75]; + HwOutputs._10a1_User_Data_128_bytes_1[76] := PlcOutputs._10a1_User_Data_128_bytes_1[76]; + HwOutputs._10a1_User_Data_128_bytes_1[77] := PlcOutputs._10a1_User_Data_128_bytes_1[77]; + HwOutputs._10a1_User_Data_128_bytes_1[78] := PlcOutputs._10a1_User_Data_128_bytes_1[78]; + HwOutputs._10a1_User_Data_128_bytes_1[79] := PlcOutputs._10a1_User_Data_128_bytes_1[79]; + HwOutputs._10a1_User_Data_128_bytes_1[80] := PlcOutputs._10a1_User_Data_128_bytes_1[80]; + HwOutputs._10a1_User_Data_128_bytes_1[81] := PlcOutputs._10a1_User_Data_128_bytes_1[81]; + HwOutputs._10a1_User_Data_128_bytes_1[82] := PlcOutputs._10a1_User_Data_128_bytes_1[82]; + HwOutputs._10a1_User_Data_128_bytes_1[83] := PlcOutputs._10a1_User_Data_128_bytes_1[83]; + HwOutputs._10a1_User_Data_128_bytes_1[84] := PlcOutputs._10a1_User_Data_128_bytes_1[84]; + HwOutputs._10a1_User_Data_128_bytes_1[85] := PlcOutputs._10a1_User_Data_128_bytes_1[85]; + HwOutputs._10a1_User_Data_128_bytes_1[86] := PlcOutputs._10a1_User_Data_128_bytes_1[86]; + HwOutputs._10a1_User_Data_128_bytes_1[87] := PlcOutputs._10a1_User_Data_128_bytes_1[87]; + HwOutputs._10a1_User_Data_128_bytes_1[88] := PlcOutputs._10a1_User_Data_128_bytes_1[88]; + HwOutputs._10a1_User_Data_128_bytes_1[89] := PlcOutputs._10a1_User_Data_128_bytes_1[89]; + HwOutputs._10a1_User_Data_128_bytes_1[90] := PlcOutputs._10a1_User_Data_128_bytes_1[90]; + HwOutputs._10a1_User_Data_128_bytes_1[91] := PlcOutputs._10a1_User_Data_128_bytes_1[91]; + HwOutputs._10a1_User_Data_128_bytes_1[92] := PlcOutputs._10a1_User_Data_128_bytes_1[92]; + HwOutputs._10a1_User_Data_128_bytes_1[93] := PlcOutputs._10a1_User_Data_128_bytes_1[93]; + HwOutputs._10a1_User_Data_128_bytes_1[94] := PlcOutputs._10a1_User_Data_128_bytes_1[94]; + HwOutputs._10a1_User_Data_128_bytes_1[95] := PlcOutputs._10a1_User_Data_128_bytes_1[95]; + HwOutputs._10a1_User_Data_128_bytes_1[96] := PlcOutputs._10a1_User_Data_128_bytes_1[96]; + HwOutputs._10a1_User_Data_128_bytes_1[97] := PlcOutputs._10a1_User_Data_128_bytes_1[97]; + HwOutputs._10a1_User_Data_128_bytes_1[98] := PlcOutputs._10a1_User_Data_128_bytes_1[98]; + HwOutputs._10a1_User_Data_128_bytes_1[99] := PlcOutputs._10a1_User_Data_128_bytes_1[99]; + HwOutputs._10a1_User_Data_128_bytes_1[100] := PlcOutputs._10a1_User_Data_128_bytes_1[100]; + HwOutputs._10a1_User_Data_128_bytes_1[101] := PlcOutputs._10a1_User_Data_128_bytes_1[101]; + HwOutputs._10a1_User_Data_128_bytes_1[102] := PlcOutputs._10a1_User_Data_128_bytes_1[102]; + HwOutputs._10a1_User_Data_128_bytes_1[103] := PlcOutputs._10a1_User_Data_128_bytes_1[103]; + HwOutputs._10a1_User_Data_128_bytes_1[104] := PlcOutputs._10a1_User_Data_128_bytes_1[104]; + HwOutputs._10a1_User_Data_128_bytes_1[105] := PlcOutputs._10a1_User_Data_128_bytes_1[105]; + HwOutputs._10a1_User_Data_128_bytes_1[106] := PlcOutputs._10a1_User_Data_128_bytes_1[106]; + HwOutputs._10a1_User_Data_128_bytes_1[107] := PlcOutputs._10a1_User_Data_128_bytes_1[107]; + HwOutputs._10a1_User_Data_128_bytes_1[108] := PlcOutputs._10a1_User_Data_128_bytes_1[108]; + HwOutputs._10a1_User_Data_128_bytes_1[109] := PlcOutputs._10a1_User_Data_128_bytes_1[109]; + HwOutputs._10a1_User_Data_128_bytes_1[110] := PlcOutputs._10a1_User_Data_128_bytes_1[110]; + HwOutputs._10a1_User_Data_128_bytes_1[111] := PlcOutputs._10a1_User_Data_128_bytes_1[111]; + HwOutputs._10a1_User_Data_128_bytes_1[112] := PlcOutputs._10a1_User_Data_128_bytes_1[112]; + HwOutputs._10a1_User_Data_128_bytes_1[113] := PlcOutputs._10a1_User_Data_128_bytes_1[113]; + HwOutputs._10a1_User_Data_128_bytes_1[114] := PlcOutputs._10a1_User_Data_128_bytes_1[114]; + HwOutputs._10a1_User_Data_128_bytes_1[115] := PlcOutputs._10a1_User_Data_128_bytes_1[115]; + HwOutputs._10a1_User_Data_128_bytes_1[116] := PlcOutputs._10a1_User_Data_128_bytes_1[116]; + HwOutputs._10a1_User_Data_128_bytes_1[117] := PlcOutputs._10a1_User_Data_128_bytes_1[117]; + HwOutputs._10a1_User_Data_128_bytes_1[118] := PlcOutputs._10a1_User_Data_128_bytes_1[118]; + HwOutputs._10a1_User_Data_128_bytes_1[119] := PlcOutputs._10a1_User_Data_128_bytes_1[119]; + HwOutputs._10a1_User_Data_128_bytes_1[120] := PlcOutputs._10a1_User_Data_128_bytes_1[120]; + HwOutputs._10a1_User_Data_128_bytes_1[121] := PlcOutputs._10a1_User_Data_128_bytes_1[121]; + HwOutputs._10a1_User_Data_128_bytes_1[122] := PlcOutputs._10a1_User_Data_128_bytes_1[122]; + HwOutputs._10a1_User_Data_128_bytes_1[123] := PlcOutputs._10a1_User_Data_128_bytes_1[123]; + HwOutputs._10a1_User_Data_128_bytes_1[124] := PlcOutputs._10a1_User_Data_128_bytes_1[124]; + HwOutputs._10a1_User_Data_128_bytes_1[125] := PlcOutputs._10a1_User_Data_128_bytes_1[125]; + HwOutputs._10a1_User_Data_128_bytes_1[126] := PlcOutputs._10a1_User_Data_128_bytes_1[126]; + HwOutputs._10a1_User_Data_128_bytes_1[127] := PlcOutputs._10a1_User_Data_128_bytes_1[127]; + HwOutputs._10a1_User_Data_128_bytes_1[128] := PlcOutputs._10a1_User_Data_128_bytes_1[128]; + HwOutputs._10a1_User_Data_128_bytes_1[129] := PlcOutputs._10a1_User_Data_128_bytes_1[129]; + HwOutputs._10a1_User_Data_128_bytes_1[130] := PlcOutputs._10a1_User_Data_128_bytes_1[130]; + HwOutputs._10a1_User_Data_128_bytes_1[131] := PlcOutputs._10a1_User_Data_128_bytes_1[131]; +END_FUNCTION diff --git a/src/templates.simple/ctrl/src/IO/HwInputs.st b/src/templates.simple/ctrl/src/IO/HwInputs.st new file mode 100644 index 000000000..9dfa1760b --- /dev/null +++ b/src/templates.simple/ctrl/src/IO/HwInputs.st @@ -0,0 +1,15 @@ +TYPE + HwInputs : STRUCT + _11a1_DI_8x24VDC_ST_1 AT %B0 : BYTE; + _11a1_DI_8x24VDC_ST_2 AT %B1 : BYTE; + _12a1_Acquisition_Status_1 AT %B2 : ARRAY[0..2] OF BYTE; + _12a1_Inspection_Status_1 AT %B5 : DWORD; + _12a1_Command_Control_1 AT %B9 : WORD; + _12a1_SoftEvent_Control_1 AT %B11 : BYTE; + _12a1_Results_64_bytes_1 AT %B12 : ARRAY[0..67] OF BYTE; + _10a1_Acquisition_Status_1 AT %B80 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 AT %B83 : BYTE; + _10a1_Soft_Event_Control_1 AT %B84 : BYTE; + _10a1_Result_Data_128_bytes_1 AT %B85 : ARRAY[0..135] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/HwOutputs.st b/src/templates.simple/ctrl/src/IO/HwOutputs.st new file mode 100644 index 000000000..97d565aed --- /dev/null +++ b/src/templates.simple/ctrl/src/IO/HwOutputs.st @@ -0,0 +1,14 @@ +TYPE + HwOutputs : STRUCT + _11a1_DQ_8x24VDC_0_5A_ST_1 AT %B0 : BYTE; + _12a1_Acquisition_Control_1 AT %B1 : BYTE; + _12a1_Inspection_Control_1 AT %B2 : BYTE; + _12a1_Command_Control_1 AT %B3 : WORD; + _12a1_SoftEvent_Control_1 AT %B5 : BYTE; + _12a1_User_Data_64_bytes_1 AT %B6 : ARRAY[0..63] OF BYTE; + _10a1_Acquisition_Control_1 AT %B70 : BYTE; + _10a1_Results_Control_1 AT %B71 : BYTE; + _10a1_Soft_Event_Control_1 AT %B72 : BYTE; + _10a1_User_Data_128_bytes_1 AT %B73 : ARRAY[0..131] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/PlcInputs.st b/src/templates.simple/ctrl/src/IO/PlcInputs.st new file mode 100644 index 000000000..7fe1d3a2a --- /dev/null +++ b/src/templates.simple/ctrl/src/IO/PlcInputs.st @@ -0,0 +1,15 @@ +TYPE + PlcInputs : STRUCT + _11a1_DI_8x24VDC_ST_1 : BYTE; + _11a1_DI_8x24VDC_ST_2 : BYTE; + _12a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _12a1_Inspection_Status_1 : DWORD; + _12a1_Command_Control_1 : WORD; + _12a1_SoftEvent_Control_1 : BYTE; + _12a1_Results_64_bytes_1 : ARRAY[0..67] OF BYTE; + _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/PlcOutputs.st b/src/templates.simple/ctrl/src/IO/PlcOutputs.st new file mode 100644 index 000000000..2ea4d4ab4 --- /dev/null +++ b/src/templates.simple/ctrl/src/IO/PlcOutputs.st @@ -0,0 +1,14 @@ +TYPE + PlcOutputs : STRUCT + _11a1_DQ_8x24VDC_0_5A_ST_1 : BYTE; + _12a1_Acquisition_Control_1 : BYTE; + _12a1_Inspection_Control_1 : BYTE; + _12a1_Command_Control_1 : WORD; + _12a1_SoftEvent_Control_1 : BYTE; + _12a1_User_Data_64_bytes_1 : ARRAY[0..63] OF BYTE; + _10a1_Acquisition_Control_1 : BYTE; + _10a1_Results_Control_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/templates.simple/ctrl/src/configuration.st b/src/templates.simple/ctrl/src/configuration.st index d080e59bb..711ba97f4 100644 --- a/src/templates.simple/ctrl/src/configuration.st +++ b/src/templates.simple/ctrl/src/configuration.st @@ -10,4 +10,14 @@ CONFIGURATION MyConfiguration S71500Rtc : AXOpen.S71500.Rtc; ContextLogger : AXOpen.Logging.AxoLogger; END_VAR + + //Copy this VAR_GLOBAL section into your configuration file inside your project. + //Do not change any names, addresses or any another content. + VAR_GLOBAL + HwInputs AT %IB0 : HwInputs; + HwOutputs AT %QB0 : HwOutputs; + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR + END_CONFIGURATION diff --git a/src/templates.simple/ctrl/src/program.st b/src/templates.simple/ctrl/src/program.st index 222d89a29..3be4c6c44 100644 --- a/src/templates.simple/ctrl/src/program.st +++ b/src/templates.simple/ctrl/src/program.st @@ -7,15 +7,33 @@ PROGRAM MyProgram S71500Rtc : AXOpen.S71500.Rtc; ContextLogger : AXOpen.Logging.AxoLogger; END_VAR + + //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. + //Do not change any names, addresses or any another content. + VAR_EXTERNAL + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR + //Copy this function call at the very beginning of your program. + //Do not change any names, addresses or any another content. + CopyInputs(); + + //PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := BYTE#127; + // Never modif this the context needs references to IN/OUT structures before it is used. Context.Inputs := REF(Inputs); Context.Outputs := REF(Outputs); - + Context.PlcInputs := REF(PlcInputs); + Context.PlcOutputs := REF(PlcOutputs); + + ContextLogger.SetMinimumLevel(AXOpen.Logging.eLogLevel#Verbose); Context.InjectRtc(S71500Rtc); Context.InjectLogger(ContextLogger); // Executes the main context of this application. Context.Run(); - + //Copy this function call at the very end of your program. + //Do not change any names, addresses or any another content. + CopyOutputs(); END_PROGRAM From 3a536d4e47cc9600627a34271263ad89bdcc5e52 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Thu, 20 Jul 2023 10:54:26 +0200 Subject: [PATCH 02/32] Create draft PR for #125 From 25edacfb1099109a088c952a11809a63f9026ef7 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Wed, 26 Jul 2023 20:03:23 +0200 Subject: [PATCH 03/32] Cognex dataman readear, very first release ready to test with the hardware --- .config/dotnet-tools.json | 6 +- cake/ApaxCmd.cs | 1 + cake/BuildContext.cs | 2 + src/AXOpen.Cognex.Vision/ctrl/.gitignore | 8 + .../ctrl/AXSharp.config.json | 1 + src/AXOpen.Cognex.Vision/ctrl/apax.yml | 19 + .../ctrl/package-lock.json | 11 + .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 357 ++++++++++++++++++ .../Tasks/AxoDatamanClearResultData.st | 116 ++++++ .../v_6_0_0/Tasks/AxoDatamanRead.st | 144 +++++++ .../AxoDataman_AcquisitionControl.st | 9 + .../AxoDataman_AcquisitionStatus.st | 12 + .../AxoDataman_Config.st | 16 + .../AxoDataman_Results.st | 12 + .../AxoDataman_ResultsControl.st | 9 + .../AxoDataman_ResultsStatus.st | 12 + .../AxoDataman_SignalStates.st | 49 +++ .../AxoDataman_SoftEventControl.st | 15 + .../AxoDataman_SoftEventStatus.st | 15 + .../AxoDataman_Status.st | 10 + .../TypeStructuresAndEnums/AxoDataman_User.st | 10 + .../eAxoDataman_ResultDataSize.st | 13 + .../eAxoDataman_UserDataSize.st | 13 + .../ExampleJsInterop.cs | 37 ++ .../Properties/AssemblyInfo.cs | 3 + .../_Imports.razor | 2 + .../axopen_cognex_vision_blazor.csproj | 31 ++ .../package-lock.json | 11 + .../wwwroot/background.png | Bin 0 -> 378 bytes .../wwwroot/exampleJsInterop.js | 6 + .../Properties/AssemblyInfo.cs | 3 + .../Resources/PlcStringResources.Designer.cs | 99 +++++ .../Resources/PlcStringResources.resx | 77 ++++ .../ix_ax_axopen_cognex_vision.csproj | 29 ++ .../AXOpen.Cognex.Vision.Tests/Usings.cs | 1 + .../axopen_cognex_vision_tests.csproj | 41 ++ .../xunit.runner.json | 4 + src/AXOpen.sln | 58 +++ src/components.abstractions/ctrl/.gitignore | 8 + .../ctrl/AXSharp.config.json | 1 + src/components.abstractions/ctrl/apax.yml | 15 + .../ctrl/package-lock.json | 11 + .../ctrl/src/IAxoCodeReader.st | 7 + .../Properties/AssemblyInfo.cs | 3 + .../_Imports.razor | 2 + ...open_components_abstractions_blazor.csproj | 35 ++ .../package-lock.json | 11 + .../wwwroot/background.png | Bin 0 -> 378 bytes .../wwwroot/exampleJsInterop.js | 6 + .../Properties/AssemblyInfo.cs | 3 + .../Resources/PlcStringResources.Designer.cs | 99 +++++ .../Resources/PlcStringResources.resx | 77 ++++ ...x_ax_axopen_components_abstractions.csproj | 32 ++ .../Usings.cs | 1 + ...xopen_components_abstractions_tests.csproj | 42 +++ .../xunit.runner.json | 4 + .../AxoComponent/AxoComponentView.razor | 12 +- src/integrations/ctrl/apax.yml | 3 +- .../AxoCognexVisionDatamanExample.st | 33 ++ .../AXOpen.Cognex.Vision/IO/CopyInputs.st | 223 +++++++++++ .../AXOpen.Cognex.Vision/IO/CopyOutputs.st | 210 +++++++++++ .../AXOpen.Cognex.Vision/IO/HwInputs.st | 15 + .../AXOpen.Cognex.Vision/IO/HwOutputs.st | 14 + .../AXOpen.Cognex.Vision/IO/PlcInputs.st | 15 + .../AXOpen.Cognex.Vision/IO/PlcOutputs.st | 14 + src/integrations/ctrl/src/configuration.st | 12 + src/integrations/ctrl/src/program.st | 39 +- .../AxoCognexVisionDatamanExample.razor | 27 ++ .../Shared/NavMenu.razor | 7 +- .../axopen_integrations.csproj | 1 + .../ctrl/.config/dotnet-tools.json | 18 + src/utils/ctrl/src/AXOpenUtils/AxoCRC_16.st | 2 +- src/utils/ctrl/src/AXOpenUtils/AxoCRC_32.st | 2 +- src/utils/ctrl/src/AXOpenUtils/AxoCRC_8.st | 2 +- src/utils/ctrl/src/AXOpenUtils/AxoXORs.st | 200 ---------- .../Conversions/FromBytes/AxoBytesToDint.st | 21 ++ .../Conversions/FromBytes/AxoBytesToInt.st | 18 + .../Conversions/AxoConversions_UnitTests.st | 33 ++ src/ws.code-workspace | 37 -- 79 files changed, 2324 insertions(+), 253 deletions(-) create mode 100644 src/AXOpen.Cognex.Vision/ctrl/.gitignore create mode 100644 src/AXOpen.Cognex.Vision/ctrl/AXSharp.config.json create mode 100644 src/AXOpen.Cognex.Vision/ctrl/apax.yml create mode 100644 src/AXOpen.Cognex.Vision/ctrl/package-lock.json create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj create mode 100644 src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs create mode 100644 src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj create mode 100644 src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json create mode 100644 src/components.abstractions/ctrl/.gitignore create mode 100644 src/components.abstractions/ctrl/AXSharp.config.json create mode 100644 src/components.abstractions/ctrl/apax.yml create mode 100644 src/components.abstractions/ctrl/package-lock.json create mode 100644 src/components.abstractions/ctrl/src/IAxoCodeReader.st create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/background.png create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions/Properties/AssemblyInfo.cs create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.Designer.cs create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.resx create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj create mode 100644 src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs create mode 100644 src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj create mode 100644 src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st create mode 100644 src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor create mode 100644 src/templates.simple/ctrl/.config/dotnet-tools.json delete mode 100644 src/utils/ctrl/src/AXOpenUtils/AxoXORs.st create mode 100644 src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToDint.st create mode 100644 src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToInt.st create mode 100644 src/utils/ctrl/test/Conversions/AxoConversions_UnitTests.st delete mode 100644 src/ws.code-workspace diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 21666e5cf..eddbaa55e 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "AXSharp.ixc": { - "version": "0.14.0-alpha.112", + "version": "0.14.0-alpha.113", "commands": [ "ixc" ] @@ -15,13 +15,13 @@ ] }, "AXSharp.ixd": { - "version": "0.14.0-alpha.112", + "version": "0.14.0-alpha.113", "commands": [ "ixd" ] }, "AXSharp.ixr": { - "version": "0.14.0-alpha.112", + "version": "0.14.0-alpha.113", "commands": [ "ixr" ] diff --git a/cake/ApaxCmd.cs b/cake/ApaxCmd.cs index 5bbc2de7b..994f1cb59 100644 --- a/cake/ApaxCmd.cs +++ b/cake/ApaxCmd.cs @@ -46,6 +46,7 @@ public static void ApaxClean(this BuildContext context, (string folder, string n RedirectStandardError = false, Silent = false }).WaitForExit(); + context.Log.Information($"apax clean finished for '{lib.folder} : {lib.name}'"); } public static void ApaxClean(this BuildContext context, (string folder, string name, string targetIp, string targetPlatform) app) diff --git a/cake/BuildContext.cs b/cake/BuildContext.cs index cc20d706a..7651544ca 100644 --- a/cake/BuildContext.cs +++ b/cake/BuildContext.cs @@ -144,6 +144,8 @@ public BuildContext(ICakeContext context, BuildParameters buildParameters) ("core", "axopen.core"), ("data", "axopen.data"), ("probers", "axopen.probers"), + ("components.abstractions", "axopen.components.abstractions"), + ("AXOpen.Cognex.Vision", "axopen.cognex.vision"), }; public IEnumerable<(string folder, string name, string targetIp, string targetPlatform)> Integrations { get; } = new[] diff --git a/src/AXOpen.Cognex.Vision/ctrl/.gitignore b/src/AXOpen.Cognex.Vision/ctrl/.gitignore new file mode 100644 index 000000000..0228acd94 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/.gitignore @@ -0,0 +1,8 @@ +.apax +.env +bin + +obj +testresult + +*.apax.tgz diff --git a/src/AXOpen.Cognex.Vision/ctrl/AXSharp.config.json b/src/AXOpen.Cognex.Vision/ctrl/AXSharp.config.json new file mode 100644 index 000000000..655bdb431 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/AXSharp.config.json @@ -0,0 +1 @@ +{"OutputProjectFolder":"..\\src\\AXOpen.Cognex.Vision"} \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/apax.yml b/src/AXOpen.Cognex.Vision/ctrl/apax.yml new file mode 100644 index 000000000..8732ee17a --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/apax.yml @@ -0,0 +1,19 @@ +name: "@ix-ax/axopen.cognex.vision" +version: '0.1.4-alpha.79' +type: lib +targets: + - axunit-llvm + - llvm +files: + - src +devDependencies: + "@ax/sdk": ^4.0.3 +scripts: + # prebuild: + # - dotnet ixc + postbuild: + - dotnet ixc +dependencies: + "@ix-ax/axopen.components.abstractions": '0.1.4-alpha.79' + "@ix-ax/axopen.utils": '0.1.4-alpha.79' + "@ax/system-timer": ^4.0.1 diff --git a/src/AXOpen.Cognex.Vision/ctrl/package-lock.json b/src/AXOpen.Cognex.Vision/ctrl/package-lock.json new file mode 100644 index 000000000..a1067c7ca --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + } + } +} diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st new file mode 100644 index 000000000..33165fce3 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -0,0 +1,357 @@ +USING AXOpen.Core; +USING AXOpen.Components.Abstractions; + +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + + CLASS PUBLIC AxoDataman EXTENDS AXOpen.Core.AxoComponent IMPLEMENTS AXOpen.Components.Abstractions.IAxoCodeReader + VAR PUBLIC + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentHeader()]} + {#ix-set:AttributeName = "<#Read#>"} + _readTask : AxoDatamanRead; + {#ix-attr:[ComponentHeader()]} + {#ix-attr:[ReadOnly()]} + {#ix-set:AttributeName = "<#Results#>"} + Results : AxoDataman_Results; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Restore#>"} + _restoreTask : AXOpen.Core.AxoTask; + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Update signal states#>"} + _updateSignalStatesTask : AXOpen.Core.AxoTask; + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Clear result data#>"} + _clearResultDataTask : AxoDatamanClearResultData; + + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Config")]} + {#ix-attr:[ReadOnly()]} + Config : AxoDataman_Config; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-attr:[ReadOnly()]} + Status : AxoDataman_Status; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("User data")]} + User : AxoDataman_User; + END_VAR + + VAR PRIVATE + _AcquisitionControl : AxoDataman_AcquisitionControl; + _AcquisitionStatus : AxoDataman_AcquisitionStatus; + _ResultsControl : AxoDataman_ResultsControl; + _ResultsStatus : AxoDataman_ResultsStatus; + _SoftEventControl : AxoDataman_SoftEventControl; + _SoftEventStatus : AxoDataman_SoftEventStatus; + _taskDisabled : BOOL; + END_VAR + + /// + /// Restores this instance. + /// + METHOD PROTECTED OVERRIDE Restore: IAxoTask + VAR + _index : INT; + END_VAR + + _updateSignalStatesTask.Restore(); + _clearResultDataTask.Restore(); + _readTask.Restore(); + + Results.Code := UINT#0; + Results.Extended := UINT#0; + Results.Id := UINT#0; + Results.Length := UINT#0; + + FOR _index := 0 TO 245 DO + Results.Data[_index] := BYTE#0; + END_FOR; + + _AcquisitionControl.TriggerEnable := FALSE; + _AcquisitionControl.Trigger := FALSE; + + _ResultsControl.EnableResultBuffering := FALSE; + _ResultsControl.ResultsAcknowledge := FALSE; + + _SoftEventControl.TrainCode := FALSE; + _SoftEventControl.TrainMatchString := FALSE; + _SoftEventControl.TrainFocus := FALSE; + _SoftEventControl.TrainBrightness := FALSE; + _SoftEventControl.Untrain := FALSE; + _SoftEventControl.ExecuteDMCC := FALSE; + _SoftEventControl.Reserved06 := FALSE; + _SoftEventControl.SetMatchString := FALSE; + + User.Option := UINT#0; + User.Length := UINT#0; + FOR _index := 0 TO 245 DO + User.Data[_index] := BYTE#0; + END_FOR; + + Status.ActionDescription := '<#Restore executed!#>'; + _restoreTask.Restore(); + END_METHOD + + /// + /// Custom logic for manual control of the AxoDataman. + /// + METHOD PROTECTED OVERRIDE ManualControl + ; + END_METHOD + + METHOD PRIVATE UpdateInputs + VAR_INPUT + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsStatus : BYTE; + SoftEventStatus : BYTE; + END_VAR + VAR_IN_OUT + ResultData : ARRAY[*] OF BYTE; + END_VAR + + _AcquisitionStatus.TriggerReady := AcquisitionStatus[0].%X0; + _AcquisitionStatus.TriggerAcknowledge := AcquisitionStatus[0].%X1; + _AcquisitionStatus.MissedAcquisition := AcquisitionStatus[0].%X3; + _AcquisitionStatus.TriggerID.%B0 := AcquisitionStatus[1]; //TODO check order of the bytes + _AcquisitionStatus.TriggerID.%B1 := AcquisitionStatus[2]; //TODO check order of the bytes + + _ResultsStatus.Decoding := ResultsStatus.%X0; + _ResultsStatus.DecodeComplete := ResultsStatus.%X1; + _ResultsStatus.ResultsBufferOverrun := ResultsStatus.%X2; + _ResultsStatus.ResultsAvailable := ResultsStatus.%X3; + _ResultsStatus.ErrorDetected := ResultsStatus.%X7; + + _SoftEventStatus.TrainCodeAcknowledge := SoftEventStatus.%X0; + _SoftEventStatus.TrainMatchStringAcknowledge := SoftEventStatus.%X1; + _SoftEventStatus.TrainFocusAcknowledge := SoftEventStatus.%X2; + _SoftEventStatus.TrainBrightnessAcknowledge := SoftEventStatus.%X3; + _SoftEventStatus.UntrainAcknowledge := SoftEventStatus.%X4; + _SoftEventStatus.ExecuteDmccAcknowledge := SoftEventStatus.%X5; + _SoftEventStatus.Reserved06 := SoftEventStatus.%X6; + _SoftEventStatus.SetMatchStringAcknowledge := SoftEventStatus.%X7; + + IF (LOWER_BOUND(ResultData,1) = 0) THEN + IF (UPPER_BOUND(ResultData,1) = 23) THEN + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_16B; + ELSIF (UPPER_BOUND(ResultData,1) = 39) THEN + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_32B; + ELSIF (UPPER_BOUND(ResultData,1) = 71) THEN + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; + ELSIF (UPPER_BOUND(ResultData,1) = 135) THEN + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_128B; + ELSIF (UPPER_BOUND(ResultData,1) = 253) THEN + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; + ELSE + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; + END_IF; + ELSE + Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; + END_IF; + + IF(Config.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN + Results.Id.%B0 := ResultData[0]; //TODO check order of the bytes + Results.Id.%B1 := ResultData[1]; //TODO check order of the bytes + Results.Code.%B0 := ResultData[2]; //TODO check order of the bytes + Results.Code.%B1 := ResultData[3]; //TODO check order of the bytes + Results.Extended.%B0 := ResultData[4]; //TODO check order of the bytes + Results.Extended.%B1 := ResultData[5]; //TODO check order of the bytes + Results.Length.%B0 := ResultData[6]; //TODO check order of the bytes + Results.Length.%B1 := ResultData[7]; //TODO check order of the bytes + END_IF; + + END_METHOD + + METHOD PRIVATE UpdateOutputs + VAR_IN_OUT + AcquisitionControl : BYTE; + ResultsControl : BYTE; + SoftEventControl : BYTE; + UserData : ARRAY[*] OF BYTE; + END_VAR + + AcquisitionControl.%X0 := _AcquisitionControl.Trigger; + AcquisitionControl.%X1 := _AcquisitionControl.TriggerEnable; + + ResultsControl.%X0 := _ResultsControl.EnableResultBuffering; + ResultsControl.%X1 := _ResultsControl.ResultsAcknowledge; + + SoftEventControl.%X0 := _SoftEventControl.TrainCode; + SoftEventControl.%X1 := _SoftEventControl.TrainMatchString; + SoftEventControl.%X2 := _SoftEventControl.TrainFocus; + SoftEventControl.%X3 := _SoftEventControl.TrainBrightness; + SoftEventControl.%X4 := _SoftEventControl.Untrain; + SoftEventControl.%X5 := _SoftEventControl.ExecuteDMCC; + SoftEventControl.%X6 := _SoftEventControl.Reserved06; + SoftEventControl.%X7 := _SoftEventControl.SetMatchString; + + IF (LOWER_BOUND(UserData,1) = 0) THEN + IF (UPPER_BOUND(UserData,1) = 19) THEN + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_16B; + ELSIF (UPPER_BOUND(UserData,1) = 35) THEN + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_32B; + ELSIF (UPPER_BOUND(UserData,1) = 67) THEN + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; + ELSIF (UPPER_BOUND(UserData,1) = 131) THEN + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_128B; + ELSIF (UPPER_BOUND(UserData,1) = 253) THEN + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; + ELSE + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; + END_IF; + ELSE + Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; + END_IF; + + IF(Config.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN + UserData[0] := User.Option.%B0; //TODO check order of the bytes + UserData[1] := User.Option.%B1; //TODO check order of the bytes + UserData[2] := User.Length.%B0; //TODO check order of the bytes + UserData[3] := User.Length.%B0; //TODO check order of the bytes + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE Open + SUPER.Open(); + END_METHOD + + METHOD PUBLIC Run + VAR_INPUT + parent : IAxoObject; + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsStatus : BYTE; + SoftEventStatus : BYTE; + END_VAR + VAR_IN_OUT + ResultData : ARRAY[*] OF BYTE; + AcquisitionControl : BYTE; + ResultsControl : BYTE; + SoftEventControl : BYTE; + UserData : ARRAY[*] OF BYTE; + END_VAR + + THIS.Initialize(parent); + THIS.Open(); + THIS.Execute(AcquisitionStatus,ResultsStatus,SoftEventStatus,ResultData,AcquisitionControl,ResultsControl,SoftEventControl,UserData); + THIS.Close(); + END_METHOD + + METHOD PUBLIC Run + VAR_INPUT + parent : IAxoContext; + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsStatus : BYTE; + SoftEventStatus : BYTE; + END_VAR + VAR_IN_OUT + ResultData : ARRAY[*] OF BYTE; + AcquisitionControl : BYTE; + ResultsControl : BYTE; + SoftEventControl : BYTE; + UserData : ARRAY[*] OF BYTE; + END_VAR + + THIS.Initialize(parent); + THIS.Open(); + THIS.Execute(AcquisitionStatus,ResultsStatus,SoftEventStatus,ResultData,AcquisitionControl,ResultsControl,SoftEventControl,UserData); + THIS.Close(); + END_METHOD + + METHOD PRIVATE Execute + VAR_INPUT + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsStatus : BYTE; + SoftEventStatus : BYTE; + END_VAR + VAR_IN_OUT + ResultData : ARRAY[*] OF BYTE; + AcquisitionControl : BYTE; + ResultsControl : BYTE; + SoftEventControl : BYTE; + UserData : ARRAY[*] OF BYTE; + END_VAR + + _restoreTask.Initialize(THIS); + _updateSignalStatesTask.Initialize(THIS); + _clearResultDataTask.Initialize(THIS); + _readTask.Initialize(THIS); + + THIS.UpdateInputs(AcquisitionStatus,ResultsStatus,SoftEventStatus,ResultData); + + //*************RESTORE******************** + _taskDisabled := FALSE; + _restoreTask.IsDisabled := _taskDisabled; + IF _restoreTask.Execute() THEN + THIS.Restore(); + END_IF; + //**************************************** + + //*************UPDATE********************* + _taskDisabled := _taskDisabled OR _restoreTask.IsBusy(); + _updateSignalStatesTask.IsDisabled:= _taskDisabled; + IF _updateSignalStatesTask.Execute() THEN + THIS.UpdateSignalStates(); + END_IF; + //**************************************** + + //*************CLEAR*DATA***************** + _taskDisabled := _taskDisabled OR _updateSignalStatesTask.IsBusy(); + _clearResultDataTask.IsDisabled := _taskDisabled; + _clearResultDataTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,Config,Status,Results); + //**************************************** + + + //*************READ*********************** + _taskDisabled := _taskDisabled OR _clearResultDataTask.IsBusy(); + _readTask.IsDisabled := _taskDisabled; + _readTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,ResultData,Config,Status,Results); + //**************************************** + + THIS.UpdateOutputs(AcquisitionControl,ResultsControl,SoftEventControl,UserData); + END_METHOD + + METHOD PROTECTED OVERRIDE Close + SUPER.Close(); + END_METHOD + + METHOD PUBLIC ClearResultData : IAxoTaskState + ClearResultData :=_clearResultDataTask.Invoke();; + END_METHOD + + METHOD PUBLIC Read : IAxoTaskState + Read := _readTask.Invoke(); + END_METHOD + + METHOD PRIVATE UpdateSignalStates + Status.SignalStatus.TriggerEnable := _AcquisitionControl.TriggerEnable; + Status.SignalStatus.Trigger := _AcquisitionControl.Trigger; + + Status.SignalStatus.EnableResultBuffering := _ResultsControl.EnableResultBuffering; + Status.SignalStatus.ResultsAcknowledge := _ResultsControl.ResultsAcknowledge; + + Status.SignalStatus.TriggerReady := _AcquisitionStatus.TriggerReady; + Status.SignalStatus.TriggerAcknowledge := _AcquisitionStatus.TriggerAcknowledge; + Status.SignalStatus.Acquiring := _AcquisitionStatus.Acquiring; + Status.SignalStatus.MissedAcquisition := _AcquisitionStatus.MissedAcquisition; + Status.SignalStatus.TriggerID := _AcquisitionStatus.TriggerID; + + Status.SignalStatus.Decoding := _ResultsStatus.Decoding; + Status.SignalStatus.DecodeComplete := _ResultsStatus.DecodeComplete; + Status.SignalStatus.ResultsBufferOverrun := _ResultsStatus.ResultsBufferOverrun; + Status.SignalStatus.ResultsAvailable := _ResultsStatus.ResultsAvailable; + Status.SignalStatus.ErrorDetected := _ResultsStatus.ErrorDetected; + + Status.SignalStatus.ResultID := Results.ID; + Status.SignalStatus.ResultCode := Results.Code; + Status.SignalStatus.ResultExtended := Results.Extended; + Status.SignalStatus.ResultLength := Results.Length; + + _updateSignalStatesTask.DoneWhen(TRUE); + END_METHOD + END_CLASS + +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st new file mode 100644 index 000000000..6d9f7d15f --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -0,0 +1,116 @@ +//USING AXOpen.Core; + +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + CLASS PUBLIC AxoDatamanClearResultData EXTENDS AXOpen.Core.AxoTask + VAR PROTECTED + _progress : INT := 0; + _infoTimer : System.Timer.OnDelay; + _errorTimer : System.Timer.OnDelay; + + // _varInfo : __SYSTEM.VAR_INFO; + // _sb : TcoCore.StringBuilder; + END_VAR + + VAR PRIVATE + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + END_VAR + + METHOD PUBLIC Run + VAR_IN_OUT + AcquisitionControl : AxoDataman_AcquisitionControl; + AcquisitionStatus : AxoDataman_AcquisitionStatus; + ResultsControl : AxoDataman_ResultsControl; + ResultsStatus : AxoDataman_ResultsStatus; + Config : AxoDataman_Config; + Status : AxoDataman_Status; + Results : AxoDataman_Results; + END_VAR + + VAR + _index : INT; + END_VAR + + IF THIS.Execute() THEN + IF _progress = 0 THEN + _infoTime := Config.InfoTime; + _errorTime := Config.ErrorTime; + // IF NOT __ISVALIDREF(inoIoData) THEN + // _varInfo :=__VARINFO(inoIoData); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSIF NOT __ISVALIDREF(inoConfig) THEN + // _varInfo :=__VARINFO(inoConfig); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSIF NOT __ISVALIDREF(inoStatus) THEN + // _varInfo :=__VARINFO(inoStatus); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSIF NOT __ISVALIDREF(inoResults) THEN + // _varInfo :=__VARINFO(inoResults); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSE + _progress := _progress + 1; + // END_IF; + END_IF; + + IF _progress = 1 THEN + Status.ActionDescription := '<#Clearing of the result data running.#>'; + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + + IF _progress = 2 THEN + AcquisitionControl.TriggerEnable := FALSE; + AcquisitionControl.Trigger := FALSE; + ResultsControl.ResultsAcknowledge := TRUE; + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the result data cleared!#>').Pin(); + Results.Id := UINT#0; + Results.Code := UINT#0; + Results.Extended := UINT#0; + Results.Length := UINT#0; + + FOR _index := 0 TO 245 DO + Results.Data[_index] := BYTE#0; + END_FOR; + //IF Tc2_System.MEMSET(destAddr:= ADR(THIS^.inoResults.Data) , fillByte:= 0 , n:= SIZEOF(THIS^.inoResults.Data)) >0 THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + //END_IF; + END_IF; + + IF _progress = 3 THEN + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be reseted!#>').Pin(); + IF NOT ResultsStatus.ResultsAvailable THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 4 THEN + ResultsControl.ResultsAcknowledge := FALSE; + THIS.DoneWhen(TRUE); + THIS.CallTimers(FALSE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + + THIS.ThrowWhen(_errorTimer.output); + END_IF; + + END_METHOD + + METHOD PRIVATE CallTimers + VAR_INPUT + signal : BOOL; + END_VAR + + _infoTimer(signal , _infoTime); + _errorTimer(signal , _errorTime ); + END_METHOD + + METHOD PROTECTED OVERRIDE OnRestore + _progress := 0; + THIS.CallTimers(FALSE); + END_METHOD + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st new file mode 100644 index 000000000..e16270365 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -0,0 +1,144 @@ +// USING AXOpen.Core; + +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + CLASS PUBLIC AxoDatamanRead EXTENDS AXOpen.Core.AxoTask + VAR PROTECTED + _progress : INT := 0; + _infoTimer : System.Timer.OnDelay; + _errorTimer : System.Timer.OnDelay; + + // _varInfo : __SYSTEM.VAR_INFO; + // _sb : TcoCore.StringBuilder; + END_VAR + + VAR PRIVATE + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + END_VAR + + METHOD PUBLIC Run + VAR_IN_OUT + AcquisitionControl : AxoDataman_AcquisitionControl; + AcquisitionStatus : AxoDataman_AcquisitionStatus; + ResultsControl : AxoDataman_ResultsControl; + ResultsStatus : AxoDataman_ResultsStatus; + ResultData : ARRAY[*] OF BYTE; + Config : AxoDataman_Config; + Status : AxoDataman_Status; + Results : AxoDataman_Results; + END_VAR + + VAR + _index : INT; + END_VAR + + IF THIS.Execute() THEN + IF _progress = 0 THEN + // IF NOT __ISVALIDREF(inoIoData) THEN + // _varInfo :=__VARINFO(inoIoData); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSIF NOT __ISVALIDREF(inoConfig) THEN + // _varInfo :=__VARINFO(inoConfig); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSIF NOT __ISVALIDREF(inoStatus) THEN + // _varInfo :=__VARINFO(inoStatus); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSIF NOT __ISVALIDREF(inoResults) THEN + // _varInfo :=__VARINFO(inoResults); + // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); + // ELSE + _progress := _progress + 1; + // END_IF; + END_IF; + + IF _progress = 1 THEN + Status.ActionDescription := '<#Reading running.#>'; + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + + IF _progress = 2 THEN + AcquisitionControl.TriggerEnable := TRUE; + AcquisitionControl.Trigger := FALSE; + ResultsControl.EnableResultBuffering := FALSE; + ResultsControl.ResultsAcknowledge := ResultsStatus.ResultsAvailable; + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be reseted!#>').Pin(); + IF NOT ResultsStatus.ResultsAvailable THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 3 THEN + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal TriggerReady to be set!#>').Pin(); + IF AcquisitionStatus.TriggerReady THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 4 THEN + AcquisitionControl.Trigger := TRUE; + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal TriggerAcknowledge to be set!#>').Pin(); + IF AcquisitionStatus.TriggerAcknowledge THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 5 THEN + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be set!#>').Pin(); + IF ResultsStatus.ResultsAvailable THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 6 THEN + THIS.ThrowWhen(Results.Code = UINT#0 OR Results.Length=UINT#0 OR Results.Length > TO_UINT(Config.ResultDataSize)); + // THIS^.inoResults.Length := THIS^.inoIoData.ResultData.ResultLength; + // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the ResultData copied!#>').Pin(); + // IF Tc2_System.MEMCPY(srcAddr := ADR(THIS^.inoIoData.ResultData.ResultData) , destAddr:= ADR(THIS^.inoResults.Data) , n:= THIS^.inoResults.Length) > 0 AND + // Tc2_System.MEMSET(destAddr:= ADR(THIS^.inoResults.Data) + THIS^.inoResults.Length, fillByte:= 0 , n:= SIZEOF(THIS^.inoResults.Data) - THIS^.inoResults.Length)>0 THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + // END_IF; + END_IF; + + IF _progress = 7 THEN + FOR _index := 0 TO (TO_INT(Results.Length) - 1) DO + Results.Data[_index] := ResultData[_index + 8]; + END_FOR; + FOR _index := TO_INT(Results.Length) TO 245 DO + Results.Data[_index] := BYTE#0; + END_FOR; + + AcquisitionControl.Trigger := FALSE; + ResultsControl.EnableResultBuffering := FALSE; + ResultsControl.ResultsAcknowledge := TRUE; + THIS.DoneWhen(TRUE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + + THIS.ThrowWhen(_errorTimer.output); + + END_IF; + END_METHOD + + METHOD PRIVATE CallTimers + VAR_INPUT + signal : BOOL; + END_VAR + + _infoTimer(signal , _infoTime); + _errorTimer(signal , _errorTime ); + END_METHOD + + METHOD PROTECTED OVERRIDE OnRestore + _progress := 0; + THIS.CallTimers(FALSE); + END_METHOD + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st new file mode 100644 index 000000000..c7180e31b --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st @@ -0,0 +1,9 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_AcquisitionControl : + STRUCT + TriggerEnable : BOOL; + Trigger : BOOL; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st new file mode 100644 index 000000000..1ff1ae920 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st @@ -0,0 +1,12 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_AcquisitionStatus : + STRUCT + TriggerReady : BOOL; + TriggerAcknowledge : BOOL; + Acquiring : BOOL; + MissedAcquisition : BOOL; + TriggerID : UINT; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st new file mode 100644 index 000000000..d35997e37 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st @@ -0,0 +1,16 @@ +USING System.SerDe; + +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + {#ix-attr:[Container(Layout.Stack)]} + AxoDataman_Config : + STRUCT + ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; + UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; + DataFormat : Endianness := Endianness#Big; + ContinuousReading : BOOL := FALSE; + InfoTime : LTIME := LT#2S; + ErrorTime : LTIME := LT#5S; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st new file mode 100644 index 000000000..c777672d3 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st @@ -0,0 +1,12 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_Results : + STRUCT + Id: UINT; + Code: UINT; + Extended: UINT; + Length : UINT; + Data : ARRAY[0..245] OF BYTE; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st new file mode 100644 index 000000000..2b80b85f2 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st @@ -0,0 +1,9 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_ResultsControl : + STRUCT + EnableResultBuffering : BOOL; + ResultsAcknowledge : BOOL; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st new file mode 100644 index 000000000..f31c43954 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st @@ -0,0 +1,12 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_ResultsStatus : + STRUCT + Decoding : BOOL; + DecodeComplete : BOOL; + ResultsBufferOverrun : BOOL; + ResultsAvailable : BOOL; + ErrorDetected : BOOL; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st new file mode 100644 index 000000000..4ccd67c25 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st @@ -0,0 +1,49 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + {attribute addProperty Name "<#Signal states#>"} + {#ix-attr:[Container(Layout.Wrap)]} + AxoDataman_SignalStates : + STRUCT + {attribute addProperty Name "<#Trigger enable#>"} + TriggerEnable : BOOL; + {attribute addProperty Name "<#Trigger#>"} + Trigger : BOOL; + + {attribute addProperty Name "<#Enable result buffering#>"} + EnableResultBuffering : BOOL; + {attribute addProperty Name "<#Result acknowledge#>"} + ResultsAcknowledge : BOOL; + + {attribute addProperty Name "<#Trigger ready#>"} + TriggerReady : BOOL; + {attribute addProperty Name "<#Trigger acknowledge#>"} + TriggerAcknowledge : BOOL; + {attribute addProperty Name "<#Acquiring#>"} + Acquiring : BOOL; + {attribute addProperty Name "<#Missed acquisition#>"} + MissedAcquisition : BOOL; + {attribute addProperty Name "<#Trigger ID#>"} + TriggerID : UINT; + + {attribute addProperty Name "<#Decoding#>"} + Decoding : BOOL; + {attribute addProperty Name "<#Decode complete#>"} + DecodeComplete : BOOL; + {attribute addProperty Name "<#Result buffer overrun#>"} + ResultsBufferOverrun : BOOL; + {attribute addProperty Name "<#Results available#>"} + ResultsAvailable : BOOL; + {attribute addProperty Name "<#Error detected#>"} + ErrorDetected : BOOL; + + {attribute addProperty Name "<#Result ID#>"} + ResultID : UINT; + {attribute addProperty Name "<#Result code#>"} + ResultCode : UINT; + {attribute addProperty Name "<#Result extended#>"} + ResultExtended : UINT; + {attribute addProperty Name "<#Result length#>"} + ResultLength : UINT; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st new file mode 100644 index 000000000..d987ac64d --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st @@ -0,0 +1,15 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_SoftEventControl : + STRUCT + TrainCode : BOOL; + TrainMatchString : BOOL; + TrainFocus : BOOL; + TrainBrightness : BOOL; + Untrain : BOOL; + ExecuteDMCC : BOOL; + Reserved06 : BOOL; + SetMatchString : BOOL; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st new file mode 100644 index 000000000..2d8e3a7bd --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st @@ -0,0 +1,15 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_SoftEventStatus : + STRUCT + TrainCodeAcknowledge : BOOL; + TrainMatchStringAcknowledge : BOOL; + TrainFocusAcknowledge : BOOL; + TrainBrightnessAcknowledge : BOOL; + UntrainAcknowledge : BOOL; + ExecuteDMCCAcknowledge : BOOL; + Reserved06 : BOOL; + SetMatchStringAcknowledge : BOOL; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st new file mode 100644 index 000000000..ab349dfcf --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -0,0 +1,10 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + {#ix-attr:[Container(Layout.Stack)]} + AxoDataman_Status : + STRUCT + ActionDescription : STRING[100]; + SignalStatus : AxoDataman_SignalStates; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st new file mode 100644 index 000000000..1a9480698 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st @@ -0,0 +1,10 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE + AxoDataman_User : + STRUCT + Option : UINT; + Length : UINT; + Data : ARRAY[0..249] OF BYTE; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st new file mode 100644 index 000000000..4488150e5 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st @@ -0,0 +1,13 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE PUBLIC + eAxoDataman_ResultDataSize : INT + ( + RESULT_DATA_SIZE_INVALID := 0, + RESULT_DATA_16B := 16, + RESULT_DATA_32B := 32, + RESULT_DATA_64B := 64, + RESULT_DATA_128B := 128, + RESULT_DATA_246B := 246 + ) := RESULT_DATA_64B; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st new file mode 100644 index 000000000..5bb8a9b56 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st @@ -0,0 +1,13 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + TYPE PUBLIC + eAxoDataman_UserDataSize : INT + ( + USER_DATA_SIZE_INVALID := 0, + USER_DATA_16B := 16, + USER_DATA_32B := 32, + USER_DATA_64B := 64, + USER_DATA_128B := 128, + USER_DATA_250B := 250 + ) := USER_DATA_64B; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs new file mode 100644 index 000000000..a8f8b7b5d --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs @@ -0,0 +1,37 @@ +using Microsoft.JSInterop; + +namespace ix.ax.core.blazor +{ + // This class provides an example of how JavaScript functionality can be wrapped + // in a .NET class for easy consumption. The associated JavaScript module is + // loaded on demand when first needed. + // + // This class can be registered as scoped DI service and then injected into Blazor + // components for use. + + //public class ExampleJsInterop : IAsyncDisposable + //{ + // private readonly Lazy> moduleTask; + + // public ExampleJsInterop(IJSRuntime jsRuntime) + // { + // moduleTask = new(() => jsRuntime.InvokeAsync( + // "import", "./_content/ix.ax.core.blazor/exampleJsInterop.js").AsTask()); + // } + + // public async ValueTask Prompt(string message) + // { + // var module = await moduleTask.Value; + // return await module.InvokeAsync("showPrompt", message); + // } + + // public async ValueTask DisposeAsync() + // { + // if (moduleTask.IsValueCreated) + // { + // var module = await moduleTask.Value; + // await module.DisposeAsync(); + // } + // } + //} +} \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..7fc953296 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using AXSharp.Presentation.Blazor.Attributes; + +[assembly: RenderableBlazorAssembly()] \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor new file mode 100644 index 000000000..9ec08f956 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor @@ -0,0 +1,2 @@ +@using Microsoft.AspNetCore.Components.Web +@using AXSharp.Presentation.Blazor.Controls.RenderableContent diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj new file mode 100644 index 000000000..980278f6d --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj @@ -0,0 +1,31 @@ + + + + net7.0 + enable + enable + AXOpen.Cognex.Vision.Blazor + AXOpen.Cognex.Vision.Blazor + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json new file mode 100644 index 000000000..a1067c7ca --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + } + } +} diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e15a3bde6e2bdb380df6a0b46d7ed00bdeb0aaa8 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK1SGdsl%54rjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^ie7oTIEF;HpS|GCbyPusHSqiXaCu3qf)82(9Gq&mZq2{Kq}M*X&MWtJ zSi1Jo7ZzfImg%g=t(qo=wsSR2lZoP(Rj#3wacN=q0?Br(rXzgZEGK2$ID{|A=5S{xJEuzSH>!M+7wSY6hB<=-E^*n0W7 S8wY^CX7F_Nb6Mw<&;$S{dxtsz literal 0 HcmV?d00001 diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js new file mode 100644 index 000000000..ea8d76ad2 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js @@ -0,0 +1,6 @@ +// This is a JavaScript module that is loaded on demand. It can export any number of +// functions, and may import other JavaScript modules if required. + +export function showPrompt(message) { + return prompt(message, 'Type anything here'); +} diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..cb7f895ae --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly:InternalsVisibleTo("axopen_cognex_vision_tests")] \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs new file mode 100644 index 000000000..53c5e8fe4 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs @@ -0,0 +1,99 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AXOpen.Core.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class PlcStringResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal PlcStringResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AXOpen.Core.Resources.PlcStringResources", typeof(PlcStringResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Command state. + /// + public static string Command_state { + get { + return ResourceManager.GetString("Command_state", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run step. + /// + public static string Run_step { + get { + return ResourceManager.GetString("Run_step", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sequence mode. + /// + public static string Sequence_mode { + get { + return ResourceManager.GetString("Sequence_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stepping mode. + /// + public static string Stepping_mode { + get { + return ResourceManager.GetString("Stepping_mode", resourceCulture); + } + } + } +} diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx new file mode 100644 index 000000000..0182b2b53 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Command state + src\AxoTask\AxoTask.st,8 + + + Stepping mode + src\AxoCoordination\AxoSequencer\AxoSequencer.st,3 + + + Sequence mode + src\AxoCoordination\AxoSequencer\AxoSequencer.st,5 + + + Run step + src\AxoCoordination\AxoSequencer\AxoSequencer.st,10 + + \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj new file mode 100644 index 000000000..a22929a50 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj @@ -0,0 +1,29 @@ + + + net7.0 + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs new file mode 100644 index 000000000..8c927eb74 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj new file mode 100644 index 000000000..aa6dfebfb --- /dev/null +++ b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj @@ -0,0 +1,41 @@ + + + net7.0 + enable + enable + + false + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + Always + + + + diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json new file mode 100644 index 000000000..7c6944a1d --- /dev/null +++ b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json @@ -0,0 +1,4 @@ +{ + "parallelizeTestCollections": false, + "maxParallelThreads": -1 +} diff --git a/src/AXOpen.sln b/src/AXOpen.sln index c7121bc4f..fb69ae903 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -128,6 +128,30 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security.Blazor", "s EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security", "security\src\AXOpen.Security\AXOpen.Security.csproj", "{52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Cognex.Vision", "AXOpen.Cognex.Vision", "{AC0F84EB-14D2-48B8-B300-1BA40C03B211}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9AA531A7-5755-4367-96AC-7B2E2710A88D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6AFC7347-C33A-451E-85C9-53CE6988FB3C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.abstractions", "components.abstractions", "{7B7AAED6-B6BF-46B5-80FF-0AE11B4D0039}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5107F409-9BF4-4066-A73D-DABBCBEA096C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_abstractions", "components.abstractions\src\AXOpen.Components.Abstractions\ix_ax_axopen_components_abstractions.csproj", "{863F8789-8441-492F-B5B1-D647B4EE370E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{D16A155E-75AE-48B5-8AC1-81112187DA28}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_components_abstractions_tests", "components.abstractions\tests\AXOpen.Components.Abstractions.Tests\axopen_components_abstractions_tests.csproj", "{B8E0FF16-6539-412C-B132-25561350C826}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_cognex_vision", "AXOpen.Cognex.Vision\src\AXOpen.Cognex.Vision\ix_ax_axopen_cognex_vision.csproj", "{BEACF24D-78B8-4B8D-B6A6-19475143AB50}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_blazor", "AXOpen.Cognex.Vision\src\AXOpen.Cognex.Vision.Blazor\axopen_cognex_vision_blazor.csproj", "{96C2A3EE-76A1-4218-A04C-31AC69BCD398}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_tests", "AXOpen.Cognex.Vision\tests\AXOpen.Cognex.Vision.Tests\axopen_cognex_vision_tests.csproj", "{58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_components_abstractions_blazor", "components.abstractions\src\AXOpen.Components.Abstractions.Blazor\axopen_components_abstractions_blazor.csproj", "{F99B9470-120F-4D27-8FD7-D1AF5C306A23}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -262,6 +286,30 @@ Global {52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1}.Release|Any CPU.ActiveCfg = Release|Any CPU {52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1}.Release|Any CPU.Build.0 = Release|Any CPU + {863F8789-8441-492F-B5B1-D647B4EE370E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {863F8789-8441-492F-B5B1-D647B4EE370E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {863F8789-8441-492F-B5B1-D647B4EE370E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {863F8789-8441-492F-B5B1-D647B4EE370E}.Release|Any CPU.Build.0 = Release|Any CPU + {B8E0FF16-6539-412C-B132-25561350C826}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B8E0FF16-6539-412C-B132-25561350C826}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B8E0FF16-6539-412C-B132-25561350C826}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B8E0FF16-6539-412C-B132-25561350C826}.Release|Any CPU.Build.0 = Release|Any CPU + {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Release|Any CPU.Build.0 = Release|Any CPU + {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Release|Any CPU.Build.0 = Release|Any CPU + {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Release|Any CPU.Build.0 = Release|Any CPU + {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -317,6 +365,16 @@ Global {1EC46148-A114-4018-92BE-93F1E0273A33} = {FFD509A8-8D3C-4756-9B2E-10A063A246E9} {7DEF0B7B-0F6C-4829-A1A9-2C0C2720BF3C} = {8017588A-7145-460D-ACEB-402D7005DA33} {52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1} = {8017588A-7145-460D-ACEB-402D7005DA33} + {9AA531A7-5755-4367-96AC-7B2E2710A88D} = {AC0F84EB-14D2-48B8-B300-1BA40C03B211} + {6AFC7347-C33A-451E-85C9-53CE6988FB3C} = {AC0F84EB-14D2-48B8-B300-1BA40C03B211} + {5107F409-9BF4-4066-A73D-DABBCBEA096C} = {7B7AAED6-B6BF-46B5-80FF-0AE11B4D0039} + {863F8789-8441-492F-B5B1-D647B4EE370E} = {5107F409-9BF4-4066-A73D-DABBCBEA096C} + {D16A155E-75AE-48B5-8AC1-81112187DA28} = {7B7AAED6-B6BF-46B5-80FF-0AE11B4D0039} + {B8E0FF16-6539-412C-B132-25561350C826} = {D16A155E-75AE-48B5-8AC1-81112187DA28} + {BEACF24D-78B8-4B8D-B6A6-19475143AB50} = {9AA531A7-5755-4367-96AC-7B2E2710A88D} + {96C2A3EE-76A1-4218-A04C-31AC69BCD398} = {9AA531A7-5755-4367-96AC-7B2E2710A88D} + {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B} = {6AFC7347-C33A-451E-85C9-53CE6988FB3C} + {F99B9470-120F-4D27-8FD7-D1AF5C306A23} = {5107F409-9BF4-4066-A73D-DABBCBEA096C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {292B45BE-E9CB-443B-979D-C0AFCD8D5675} diff --git a/src/components.abstractions/ctrl/.gitignore b/src/components.abstractions/ctrl/.gitignore new file mode 100644 index 000000000..0228acd94 --- /dev/null +++ b/src/components.abstractions/ctrl/.gitignore @@ -0,0 +1,8 @@ +.apax +.env +bin + +obj +testresult + +*.apax.tgz diff --git a/src/components.abstractions/ctrl/AXSharp.config.json b/src/components.abstractions/ctrl/AXSharp.config.json new file mode 100644 index 000000000..57d005617 --- /dev/null +++ b/src/components.abstractions/ctrl/AXSharp.config.json @@ -0,0 +1 @@ +{"OutputProjectFolder":"..\\src\\AXOpen.Components.Abstractions"} \ No newline at end of file diff --git a/src/components.abstractions/ctrl/apax.yml b/src/components.abstractions/ctrl/apax.yml new file mode 100644 index 000000000..8c4d162fd --- /dev/null +++ b/src/components.abstractions/ctrl/apax.yml @@ -0,0 +1,15 @@ +name: "@ix-ax/axopen.components.abstractions" +version: '0.1.4-alpha.79' +type: lib +targets: + - axunit-llvm + - llvm +files: + - src +devDependencies: + "@ax/sdk": ^4.0.3 +scripts: + postbuild: + - dotnet ixc +dependencies: + "@ix-ax/axopen.core": '0.1.4-alpha.79' diff --git a/src/components.abstractions/ctrl/package-lock.json b/src/components.abstractions/ctrl/package-lock.json new file mode 100644 index 000000000..a1067c7ca --- /dev/null +++ b/src/components.abstractions/ctrl/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + } + } +} diff --git a/src/components.abstractions/ctrl/src/IAxoCodeReader.st b/src/components.abstractions/ctrl/src/IAxoCodeReader.st new file mode 100644 index 000000000..1ec923b96 --- /dev/null +++ b/src/components.abstractions/ctrl/src/IAxoCodeReader.st @@ -0,0 +1,7 @@ +USING AXOpen.Core; +NAMESPACE AXOpen.Components.Abstractions + INTERFACE PUBLIC IAxoCodeReader + METHOD ClearResultData : IAxoTaskState END_METHOD + METHOD Read : IAxoTaskState END_METHOD + END_INTERFACE +END_NAMESPACE diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..7fc953296 --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using AXSharp.Presentation.Blazor.Attributes; + +[assembly: RenderableBlazorAssembly()] \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor new file mode 100644 index 000000000..9ec08f956 --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor @@ -0,0 +1,2 @@ +@using Microsoft.AspNetCore.Components.Web +@using AXSharp.Presentation.Blazor.Controls.RenderableContent diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj new file mode 100644 index 000000000..239acfdbf --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj @@ -0,0 +1,35 @@ + + + + net7.0 + enable + enable + AXOpen.Core.Blazor + AXOpen.Core.Blazor + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json new file mode 100644 index 000000000..a1067c7ca --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + } + } +} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/background.png b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e15a3bde6e2bdb380df6a0b46d7ed00bdeb0aaa8 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK1SGdsl%54rjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^ie7oTIEF;HpS|GCbyPusHSqiXaCu3qf)82(9Gq&mZq2{Kq}M*X&MWtJ zSi1Jo7ZzfImg%g=t(qo=wsSR2lZoP(Rj#3wacN=q0?Br(rXzgZEGK2$ID{|A=5S{xJEuzSH>!M+7wSY6hB<=-E^*n0W7 S8wY^CX7F_Nb6Mw<&;$S{dxtsz literal 0 HcmV?d00001 diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js new file mode 100644 index 000000000..ea8d76ad2 --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js @@ -0,0 +1,6 @@ +// This is a JavaScript module that is loaded on demand. It can export any number of +// functions, and may import other JavaScript modules if required. + +export function showPrompt(message) { + return prompt(message, 'Type anything here'); +} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/Properties/AssemblyInfo.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..5abc351bd --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly:InternalsVisibleTo("axopen_core_tests")] \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.Designer.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.Designer.cs new file mode 100644 index 000000000..53c5e8fe4 --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.Designer.cs @@ -0,0 +1,99 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AXOpen.Core.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class PlcStringResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal PlcStringResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AXOpen.Core.Resources.PlcStringResources", typeof(PlcStringResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Command state. + /// + public static string Command_state { + get { + return ResourceManager.GetString("Command_state", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run step. + /// + public static string Run_step { + get { + return ResourceManager.GetString("Run_step", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sequence mode. + /// + public static string Sequence_mode { + get { + return ResourceManager.GetString("Sequence_mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stepping mode. + /// + public static string Stepping_mode { + get { + return ResourceManager.GetString("Stepping_mode", resourceCulture); + } + } + } +} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.resx b/src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.resx new file mode 100644 index 000000000..0182b2b53 --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/Resources/PlcStringResources.resx @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Command state + src\AxoTask\AxoTask.st,8 + + + Stepping mode + src\AxoCoordination\AxoSequencer\AxoSequencer.st,3 + + + Sequence mode + src\AxoCoordination\AxoSequencer\AxoSequencer.st,5 + + + Run step + src\AxoCoordination\AxoSequencer\AxoSequencer.st,10 + + \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj new file mode 100644 index 000000000..6e899e4ae --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj @@ -0,0 +1,32 @@ + + + net7.0 + enable + enable + AXOpen.Components.Abstractions + AXOpen.Components.Abstractions + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs new file mode 100644 index 000000000..8c927eb74 --- /dev/null +++ b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj new file mode 100644 index 000000000..78a6369e3 --- /dev/null +++ b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj @@ -0,0 +1,42 @@ + + + + net7.0 + enable + enable + + false + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + Always + + + + diff --git a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json new file mode 100644 index 000000000..7c6944a1d --- /dev/null +++ b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json @@ -0,0 +1,4 @@ +{ + "parallelizeTestCollections": false, + "maxParallelThreads": -1 +} diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor index 0273a4fcd..1f65aa048 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor @@ -20,17 +20,15 @@
@if (@Component._isManuallyControllable.Cyclic) { - + currentPresentation = "Command-Control"; } else { - + currentPresentation = "Status-Display"; } +
@if (containsDetailsAttribute) diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index 35481d816..f738a37f7 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -11,7 +11,8 @@ devDependencies: dependencies: "@ix-ax/axopen.data": '0.1.4-alpha.79' "@ix-ax/axopen.probers": '0.1.4-alpha.79' - "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' + "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' + "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' variables: APAX_BUILD_ARGS: [ -d ] diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st new file mode 100644 index 000000000..b94f08d54 --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -0,0 +1,33 @@ +USING AXOpen.Core; +//USING AXOpen.Cognex.Vision.v_6_0_0_0; + +NAMESPACE AxoCognexVisionDatamanExamples + + CLASS AxoCognexVisionDatamanExampleContext EXTENDS AXOpen.AxoContext + VAR PUBLIC + {#ix-set:AttributeName = "10A1"} + MyDataman : AXOpen.Cognex.Vision.v_6_0_0_0.AxoDataman; + {#ix-set:AttributeName = "<#Activate manual control#>"} + ActivateManualControl : BOOL; + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR + + METHOD PROTECTED OVERRIDE Main + // Example of the activation of the manual control. + IF ActivateManualControl THEN + MyDataman.ActivateManualControl(); + END_IF; + // Calling the main method `Run` with respective input and output variables. + MyDataman.Run( parent := THIS, + AcquisitionStatus := PlcInputs._10a1_Acquisition_Status_1, + ResultsStatus := PlcInputs._10a1_Results_Status_1, + SoftEventStatus := PlcInputs._10a1_Soft_Event_Control_1, + ResultData := PlcInputs._10a1_Result_Data_128_bytes_1, + AcquisitionControl := PlcOutputs._10a1_Acquisition_Control_1, + ResultsControl := PlcOutputs._10a1_Results_Control_1, + SoftEventControl := PlcOutputs._10a1_Soft_Event_Control_1, + UserData := PlcOutputs._10a1_User_Data_128_bytes_1); + END_METHOD + END_CLASS +END_NAMESPACE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st new file mode 100644 index 000000000..a1690b2c6 --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st @@ -0,0 +1,223 @@ +FUNCTION CopyInputs + VAR_EXTERNAL + HwInputs : HwInputs; + PlcInputs : PlcInputs; + END_VAR + PlcInputs._11a1_DI_8x24VDC_ST_1 := HwInputs._11a1_DI_8x24VDC_ST_1; + PlcInputs._11a1_DI_8x24VDC_ST_2 := HwInputs._11a1_DI_8x24VDC_ST_2; + PlcInputs._12a1_Acquisition_Status_1[0] := HwInputs._12a1_Acquisition_Status_1[0]; + PlcInputs._12a1_Acquisition_Status_1[1] := HwInputs._12a1_Acquisition_Status_1[1]; + PlcInputs._12a1_Acquisition_Status_1[2] := HwInputs._12a1_Acquisition_Status_1[2]; + PlcInputs._12a1_Inspection_Status_1 := HwInputs._12a1_Inspection_Status_1; + PlcInputs._12a1_Command_Control_1 := HwInputs._12a1_Command_Control_1; + PlcInputs._12a1_SoftEvent_Control_1 := HwInputs._12a1_SoftEvent_Control_1; + PlcInputs._12a1_Results_64_bytes_1[0] := HwInputs._12a1_Results_64_bytes_1[0]; + PlcInputs._12a1_Results_64_bytes_1[1] := HwInputs._12a1_Results_64_bytes_1[1]; + PlcInputs._12a1_Results_64_bytes_1[2] := HwInputs._12a1_Results_64_bytes_1[2]; + PlcInputs._12a1_Results_64_bytes_1[3] := HwInputs._12a1_Results_64_bytes_1[3]; + PlcInputs._12a1_Results_64_bytes_1[4] := HwInputs._12a1_Results_64_bytes_1[4]; + PlcInputs._12a1_Results_64_bytes_1[5] := HwInputs._12a1_Results_64_bytes_1[5]; + PlcInputs._12a1_Results_64_bytes_1[6] := HwInputs._12a1_Results_64_bytes_1[6]; + PlcInputs._12a1_Results_64_bytes_1[7] := HwInputs._12a1_Results_64_bytes_1[7]; + PlcInputs._12a1_Results_64_bytes_1[8] := HwInputs._12a1_Results_64_bytes_1[8]; + PlcInputs._12a1_Results_64_bytes_1[9] := HwInputs._12a1_Results_64_bytes_1[9]; + PlcInputs._12a1_Results_64_bytes_1[10] := HwInputs._12a1_Results_64_bytes_1[10]; + PlcInputs._12a1_Results_64_bytes_1[11] := HwInputs._12a1_Results_64_bytes_1[11]; + PlcInputs._12a1_Results_64_bytes_1[12] := HwInputs._12a1_Results_64_bytes_1[12]; + PlcInputs._12a1_Results_64_bytes_1[13] := HwInputs._12a1_Results_64_bytes_1[13]; + PlcInputs._12a1_Results_64_bytes_1[14] := HwInputs._12a1_Results_64_bytes_1[14]; + PlcInputs._12a1_Results_64_bytes_1[15] := HwInputs._12a1_Results_64_bytes_1[15]; + PlcInputs._12a1_Results_64_bytes_1[16] := HwInputs._12a1_Results_64_bytes_1[16]; + PlcInputs._12a1_Results_64_bytes_1[17] := HwInputs._12a1_Results_64_bytes_1[17]; + PlcInputs._12a1_Results_64_bytes_1[18] := HwInputs._12a1_Results_64_bytes_1[18]; + PlcInputs._12a1_Results_64_bytes_1[19] := HwInputs._12a1_Results_64_bytes_1[19]; + PlcInputs._12a1_Results_64_bytes_1[20] := HwInputs._12a1_Results_64_bytes_1[20]; + PlcInputs._12a1_Results_64_bytes_1[21] := HwInputs._12a1_Results_64_bytes_1[21]; + PlcInputs._12a1_Results_64_bytes_1[22] := HwInputs._12a1_Results_64_bytes_1[22]; + PlcInputs._12a1_Results_64_bytes_1[23] := HwInputs._12a1_Results_64_bytes_1[23]; + PlcInputs._12a1_Results_64_bytes_1[24] := HwInputs._12a1_Results_64_bytes_1[24]; + PlcInputs._12a1_Results_64_bytes_1[25] := HwInputs._12a1_Results_64_bytes_1[25]; + PlcInputs._12a1_Results_64_bytes_1[26] := HwInputs._12a1_Results_64_bytes_1[26]; + PlcInputs._12a1_Results_64_bytes_1[27] := HwInputs._12a1_Results_64_bytes_1[27]; + PlcInputs._12a1_Results_64_bytes_1[28] := HwInputs._12a1_Results_64_bytes_1[28]; + PlcInputs._12a1_Results_64_bytes_1[29] := HwInputs._12a1_Results_64_bytes_1[29]; + PlcInputs._12a1_Results_64_bytes_1[30] := HwInputs._12a1_Results_64_bytes_1[30]; + PlcInputs._12a1_Results_64_bytes_1[31] := HwInputs._12a1_Results_64_bytes_1[31]; + PlcInputs._12a1_Results_64_bytes_1[32] := HwInputs._12a1_Results_64_bytes_1[32]; + PlcInputs._12a1_Results_64_bytes_1[33] := HwInputs._12a1_Results_64_bytes_1[33]; + PlcInputs._12a1_Results_64_bytes_1[34] := HwInputs._12a1_Results_64_bytes_1[34]; + PlcInputs._12a1_Results_64_bytes_1[35] := HwInputs._12a1_Results_64_bytes_1[35]; + PlcInputs._12a1_Results_64_bytes_1[36] := HwInputs._12a1_Results_64_bytes_1[36]; + PlcInputs._12a1_Results_64_bytes_1[37] := HwInputs._12a1_Results_64_bytes_1[37]; + PlcInputs._12a1_Results_64_bytes_1[38] := HwInputs._12a1_Results_64_bytes_1[38]; + PlcInputs._12a1_Results_64_bytes_1[39] := HwInputs._12a1_Results_64_bytes_1[39]; + PlcInputs._12a1_Results_64_bytes_1[40] := HwInputs._12a1_Results_64_bytes_1[40]; + PlcInputs._12a1_Results_64_bytes_1[41] := HwInputs._12a1_Results_64_bytes_1[41]; + PlcInputs._12a1_Results_64_bytes_1[42] := HwInputs._12a1_Results_64_bytes_1[42]; + PlcInputs._12a1_Results_64_bytes_1[43] := HwInputs._12a1_Results_64_bytes_1[43]; + PlcInputs._12a1_Results_64_bytes_1[44] := HwInputs._12a1_Results_64_bytes_1[44]; + PlcInputs._12a1_Results_64_bytes_1[45] := HwInputs._12a1_Results_64_bytes_1[45]; + PlcInputs._12a1_Results_64_bytes_1[46] := HwInputs._12a1_Results_64_bytes_1[46]; + PlcInputs._12a1_Results_64_bytes_1[47] := HwInputs._12a1_Results_64_bytes_1[47]; + PlcInputs._12a1_Results_64_bytes_1[48] := HwInputs._12a1_Results_64_bytes_1[48]; + PlcInputs._12a1_Results_64_bytes_1[49] := HwInputs._12a1_Results_64_bytes_1[49]; + PlcInputs._12a1_Results_64_bytes_1[50] := HwInputs._12a1_Results_64_bytes_1[50]; + PlcInputs._12a1_Results_64_bytes_1[51] := HwInputs._12a1_Results_64_bytes_1[51]; + PlcInputs._12a1_Results_64_bytes_1[52] := HwInputs._12a1_Results_64_bytes_1[52]; + PlcInputs._12a1_Results_64_bytes_1[53] := HwInputs._12a1_Results_64_bytes_1[53]; + PlcInputs._12a1_Results_64_bytes_1[54] := HwInputs._12a1_Results_64_bytes_1[54]; + PlcInputs._12a1_Results_64_bytes_1[55] := HwInputs._12a1_Results_64_bytes_1[55]; + PlcInputs._12a1_Results_64_bytes_1[56] := HwInputs._12a1_Results_64_bytes_1[56]; + PlcInputs._12a1_Results_64_bytes_1[57] := HwInputs._12a1_Results_64_bytes_1[57]; + PlcInputs._12a1_Results_64_bytes_1[58] := HwInputs._12a1_Results_64_bytes_1[58]; + PlcInputs._12a1_Results_64_bytes_1[59] := HwInputs._12a1_Results_64_bytes_1[59]; + PlcInputs._12a1_Results_64_bytes_1[60] := HwInputs._12a1_Results_64_bytes_1[60]; + PlcInputs._12a1_Results_64_bytes_1[61] := HwInputs._12a1_Results_64_bytes_1[61]; + PlcInputs._12a1_Results_64_bytes_1[62] := HwInputs._12a1_Results_64_bytes_1[62]; + PlcInputs._12a1_Results_64_bytes_1[63] := HwInputs._12a1_Results_64_bytes_1[63]; + PlcInputs._12a1_Results_64_bytes_1[64] := HwInputs._12a1_Results_64_bytes_1[64]; + PlcInputs._12a1_Results_64_bytes_1[65] := HwInputs._12a1_Results_64_bytes_1[65]; + PlcInputs._12a1_Results_64_bytes_1[66] := HwInputs._12a1_Results_64_bytes_1[66]; + PlcInputs._12a1_Results_64_bytes_1[67] := HwInputs._12a1_Results_64_bytes_1[67]; + PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; + PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; + PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; + PlcInputs._10a1_Results_Status_1 := HwInputs._10a1_Results_Status_1; + PlcInputs._10a1_Soft_Event_Control_1 := HwInputs._10a1_Soft_Event_Control_1; + PlcInputs._10a1_Result_Data_128_bytes_1[0] := HwInputs._10a1_Result_Data_128_bytes_1[0]; + PlcInputs._10a1_Result_Data_128_bytes_1[1] := HwInputs._10a1_Result_Data_128_bytes_1[1]; + PlcInputs._10a1_Result_Data_128_bytes_1[2] := HwInputs._10a1_Result_Data_128_bytes_1[2]; + PlcInputs._10a1_Result_Data_128_bytes_1[3] := HwInputs._10a1_Result_Data_128_bytes_1[3]; + PlcInputs._10a1_Result_Data_128_bytes_1[4] := HwInputs._10a1_Result_Data_128_bytes_1[4]; + PlcInputs._10a1_Result_Data_128_bytes_1[5] := HwInputs._10a1_Result_Data_128_bytes_1[5]; + PlcInputs._10a1_Result_Data_128_bytes_1[6] := HwInputs._10a1_Result_Data_128_bytes_1[6]; + PlcInputs._10a1_Result_Data_128_bytes_1[7] := HwInputs._10a1_Result_Data_128_bytes_1[7]; + PlcInputs._10a1_Result_Data_128_bytes_1[8] := HwInputs._10a1_Result_Data_128_bytes_1[8]; + PlcInputs._10a1_Result_Data_128_bytes_1[9] := HwInputs._10a1_Result_Data_128_bytes_1[9]; + PlcInputs._10a1_Result_Data_128_bytes_1[10] := HwInputs._10a1_Result_Data_128_bytes_1[10]; + PlcInputs._10a1_Result_Data_128_bytes_1[11] := HwInputs._10a1_Result_Data_128_bytes_1[11]; + PlcInputs._10a1_Result_Data_128_bytes_1[12] := HwInputs._10a1_Result_Data_128_bytes_1[12]; + PlcInputs._10a1_Result_Data_128_bytes_1[13] := HwInputs._10a1_Result_Data_128_bytes_1[13]; + PlcInputs._10a1_Result_Data_128_bytes_1[14] := HwInputs._10a1_Result_Data_128_bytes_1[14]; + PlcInputs._10a1_Result_Data_128_bytes_1[15] := HwInputs._10a1_Result_Data_128_bytes_1[15]; + PlcInputs._10a1_Result_Data_128_bytes_1[16] := HwInputs._10a1_Result_Data_128_bytes_1[16]; + PlcInputs._10a1_Result_Data_128_bytes_1[17] := HwInputs._10a1_Result_Data_128_bytes_1[17]; + PlcInputs._10a1_Result_Data_128_bytes_1[18] := HwInputs._10a1_Result_Data_128_bytes_1[18]; + PlcInputs._10a1_Result_Data_128_bytes_1[19] := HwInputs._10a1_Result_Data_128_bytes_1[19]; + PlcInputs._10a1_Result_Data_128_bytes_1[20] := HwInputs._10a1_Result_Data_128_bytes_1[20]; + PlcInputs._10a1_Result_Data_128_bytes_1[21] := HwInputs._10a1_Result_Data_128_bytes_1[21]; + PlcInputs._10a1_Result_Data_128_bytes_1[22] := HwInputs._10a1_Result_Data_128_bytes_1[22]; + PlcInputs._10a1_Result_Data_128_bytes_1[23] := HwInputs._10a1_Result_Data_128_bytes_1[23]; + PlcInputs._10a1_Result_Data_128_bytes_1[24] := HwInputs._10a1_Result_Data_128_bytes_1[24]; + PlcInputs._10a1_Result_Data_128_bytes_1[25] := HwInputs._10a1_Result_Data_128_bytes_1[25]; + PlcInputs._10a1_Result_Data_128_bytes_1[26] := HwInputs._10a1_Result_Data_128_bytes_1[26]; + PlcInputs._10a1_Result_Data_128_bytes_1[27] := HwInputs._10a1_Result_Data_128_bytes_1[27]; + PlcInputs._10a1_Result_Data_128_bytes_1[28] := HwInputs._10a1_Result_Data_128_bytes_1[28]; + PlcInputs._10a1_Result_Data_128_bytes_1[29] := HwInputs._10a1_Result_Data_128_bytes_1[29]; + PlcInputs._10a1_Result_Data_128_bytes_1[30] := HwInputs._10a1_Result_Data_128_bytes_1[30]; + PlcInputs._10a1_Result_Data_128_bytes_1[31] := HwInputs._10a1_Result_Data_128_bytes_1[31]; + PlcInputs._10a1_Result_Data_128_bytes_1[32] := HwInputs._10a1_Result_Data_128_bytes_1[32]; + PlcInputs._10a1_Result_Data_128_bytes_1[33] := HwInputs._10a1_Result_Data_128_bytes_1[33]; + PlcInputs._10a1_Result_Data_128_bytes_1[34] := HwInputs._10a1_Result_Data_128_bytes_1[34]; + PlcInputs._10a1_Result_Data_128_bytes_1[35] := HwInputs._10a1_Result_Data_128_bytes_1[35]; + PlcInputs._10a1_Result_Data_128_bytes_1[36] := HwInputs._10a1_Result_Data_128_bytes_1[36]; + PlcInputs._10a1_Result_Data_128_bytes_1[37] := HwInputs._10a1_Result_Data_128_bytes_1[37]; + PlcInputs._10a1_Result_Data_128_bytes_1[38] := HwInputs._10a1_Result_Data_128_bytes_1[38]; + PlcInputs._10a1_Result_Data_128_bytes_1[39] := HwInputs._10a1_Result_Data_128_bytes_1[39]; + PlcInputs._10a1_Result_Data_128_bytes_1[40] := HwInputs._10a1_Result_Data_128_bytes_1[40]; + PlcInputs._10a1_Result_Data_128_bytes_1[41] := HwInputs._10a1_Result_Data_128_bytes_1[41]; + PlcInputs._10a1_Result_Data_128_bytes_1[42] := HwInputs._10a1_Result_Data_128_bytes_1[42]; + PlcInputs._10a1_Result_Data_128_bytes_1[43] := HwInputs._10a1_Result_Data_128_bytes_1[43]; + PlcInputs._10a1_Result_Data_128_bytes_1[44] := HwInputs._10a1_Result_Data_128_bytes_1[44]; + PlcInputs._10a1_Result_Data_128_bytes_1[45] := HwInputs._10a1_Result_Data_128_bytes_1[45]; + PlcInputs._10a1_Result_Data_128_bytes_1[46] := HwInputs._10a1_Result_Data_128_bytes_1[46]; + PlcInputs._10a1_Result_Data_128_bytes_1[47] := HwInputs._10a1_Result_Data_128_bytes_1[47]; + PlcInputs._10a1_Result_Data_128_bytes_1[48] := HwInputs._10a1_Result_Data_128_bytes_1[48]; + PlcInputs._10a1_Result_Data_128_bytes_1[49] := HwInputs._10a1_Result_Data_128_bytes_1[49]; + PlcInputs._10a1_Result_Data_128_bytes_1[50] := HwInputs._10a1_Result_Data_128_bytes_1[50]; + PlcInputs._10a1_Result_Data_128_bytes_1[51] := HwInputs._10a1_Result_Data_128_bytes_1[51]; + PlcInputs._10a1_Result_Data_128_bytes_1[52] := HwInputs._10a1_Result_Data_128_bytes_1[52]; + PlcInputs._10a1_Result_Data_128_bytes_1[53] := HwInputs._10a1_Result_Data_128_bytes_1[53]; + PlcInputs._10a1_Result_Data_128_bytes_1[54] := HwInputs._10a1_Result_Data_128_bytes_1[54]; + PlcInputs._10a1_Result_Data_128_bytes_1[55] := HwInputs._10a1_Result_Data_128_bytes_1[55]; + PlcInputs._10a1_Result_Data_128_bytes_1[56] := HwInputs._10a1_Result_Data_128_bytes_1[56]; + PlcInputs._10a1_Result_Data_128_bytes_1[57] := HwInputs._10a1_Result_Data_128_bytes_1[57]; + PlcInputs._10a1_Result_Data_128_bytes_1[58] := HwInputs._10a1_Result_Data_128_bytes_1[58]; + PlcInputs._10a1_Result_Data_128_bytes_1[59] := HwInputs._10a1_Result_Data_128_bytes_1[59]; + PlcInputs._10a1_Result_Data_128_bytes_1[60] := HwInputs._10a1_Result_Data_128_bytes_1[60]; + PlcInputs._10a1_Result_Data_128_bytes_1[61] := HwInputs._10a1_Result_Data_128_bytes_1[61]; + PlcInputs._10a1_Result_Data_128_bytes_1[62] := HwInputs._10a1_Result_Data_128_bytes_1[62]; + PlcInputs._10a1_Result_Data_128_bytes_1[63] := HwInputs._10a1_Result_Data_128_bytes_1[63]; + PlcInputs._10a1_Result_Data_128_bytes_1[64] := HwInputs._10a1_Result_Data_128_bytes_1[64]; + PlcInputs._10a1_Result_Data_128_bytes_1[65] := HwInputs._10a1_Result_Data_128_bytes_1[65]; + PlcInputs._10a1_Result_Data_128_bytes_1[66] := HwInputs._10a1_Result_Data_128_bytes_1[66]; + PlcInputs._10a1_Result_Data_128_bytes_1[67] := HwInputs._10a1_Result_Data_128_bytes_1[67]; + PlcInputs._10a1_Result_Data_128_bytes_1[68] := HwInputs._10a1_Result_Data_128_bytes_1[68]; + PlcInputs._10a1_Result_Data_128_bytes_1[69] := HwInputs._10a1_Result_Data_128_bytes_1[69]; + PlcInputs._10a1_Result_Data_128_bytes_1[70] := HwInputs._10a1_Result_Data_128_bytes_1[70]; + PlcInputs._10a1_Result_Data_128_bytes_1[71] := HwInputs._10a1_Result_Data_128_bytes_1[71]; + PlcInputs._10a1_Result_Data_128_bytes_1[72] := HwInputs._10a1_Result_Data_128_bytes_1[72]; + PlcInputs._10a1_Result_Data_128_bytes_1[73] := HwInputs._10a1_Result_Data_128_bytes_1[73]; + PlcInputs._10a1_Result_Data_128_bytes_1[74] := HwInputs._10a1_Result_Data_128_bytes_1[74]; + PlcInputs._10a1_Result_Data_128_bytes_1[75] := HwInputs._10a1_Result_Data_128_bytes_1[75]; + PlcInputs._10a1_Result_Data_128_bytes_1[76] := HwInputs._10a1_Result_Data_128_bytes_1[76]; + PlcInputs._10a1_Result_Data_128_bytes_1[77] := HwInputs._10a1_Result_Data_128_bytes_1[77]; + PlcInputs._10a1_Result_Data_128_bytes_1[78] := HwInputs._10a1_Result_Data_128_bytes_1[78]; + PlcInputs._10a1_Result_Data_128_bytes_1[79] := HwInputs._10a1_Result_Data_128_bytes_1[79]; + PlcInputs._10a1_Result_Data_128_bytes_1[80] := HwInputs._10a1_Result_Data_128_bytes_1[80]; + PlcInputs._10a1_Result_Data_128_bytes_1[81] := HwInputs._10a1_Result_Data_128_bytes_1[81]; + PlcInputs._10a1_Result_Data_128_bytes_1[82] := HwInputs._10a1_Result_Data_128_bytes_1[82]; + PlcInputs._10a1_Result_Data_128_bytes_1[83] := HwInputs._10a1_Result_Data_128_bytes_1[83]; + PlcInputs._10a1_Result_Data_128_bytes_1[84] := HwInputs._10a1_Result_Data_128_bytes_1[84]; + PlcInputs._10a1_Result_Data_128_bytes_1[85] := HwInputs._10a1_Result_Data_128_bytes_1[85]; + PlcInputs._10a1_Result_Data_128_bytes_1[86] := HwInputs._10a1_Result_Data_128_bytes_1[86]; + PlcInputs._10a1_Result_Data_128_bytes_1[87] := HwInputs._10a1_Result_Data_128_bytes_1[87]; + PlcInputs._10a1_Result_Data_128_bytes_1[88] := HwInputs._10a1_Result_Data_128_bytes_1[88]; + PlcInputs._10a1_Result_Data_128_bytes_1[89] := HwInputs._10a1_Result_Data_128_bytes_1[89]; + PlcInputs._10a1_Result_Data_128_bytes_1[90] := HwInputs._10a1_Result_Data_128_bytes_1[90]; + PlcInputs._10a1_Result_Data_128_bytes_1[91] := HwInputs._10a1_Result_Data_128_bytes_1[91]; + PlcInputs._10a1_Result_Data_128_bytes_1[92] := HwInputs._10a1_Result_Data_128_bytes_1[92]; + PlcInputs._10a1_Result_Data_128_bytes_1[93] := HwInputs._10a1_Result_Data_128_bytes_1[93]; + PlcInputs._10a1_Result_Data_128_bytes_1[94] := HwInputs._10a1_Result_Data_128_bytes_1[94]; + PlcInputs._10a1_Result_Data_128_bytes_1[95] := HwInputs._10a1_Result_Data_128_bytes_1[95]; + PlcInputs._10a1_Result_Data_128_bytes_1[96] := HwInputs._10a1_Result_Data_128_bytes_1[96]; + PlcInputs._10a1_Result_Data_128_bytes_1[97] := HwInputs._10a1_Result_Data_128_bytes_1[97]; + PlcInputs._10a1_Result_Data_128_bytes_1[98] := HwInputs._10a1_Result_Data_128_bytes_1[98]; + PlcInputs._10a1_Result_Data_128_bytes_1[99] := HwInputs._10a1_Result_Data_128_bytes_1[99]; + PlcInputs._10a1_Result_Data_128_bytes_1[100] := HwInputs._10a1_Result_Data_128_bytes_1[100]; + PlcInputs._10a1_Result_Data_128_bytes_1[101] := HwInputs._10a1_Result_Data_128_bytes_1[101]; + PlcInputs._10a1_Result_Data_128_bytes_1[102] := HwInputs._10a1_Result_Data_128_bytes_1[102]; + PlcInputs._10a1_Result_Data_128_bytes_1[103] := HwInputs._10a1_Result_Data_128_bytes_1[103]; + PlcInputs._10a1_Result_Data_128_bytes_1[104] := HwInputs._10a1_Result_Data_128_bytes_1[104]; + PlcInputs._10a1_Result_Data_128_bytes_1[105] := HwInputs._10a1_Result_Data_128_bytes_1[105]; + PlcInputs._10a1_Result_Data_128_bytes_1[106] := HwInputs._10a1_Result_Data_128_bytes_1[106]; + PlcInputs._10a1_Result_Data_128_bytes_1[107] := HwInputs._10a1_Result_Data_128_bytes_1[107]; + PlcInputs._10a1_Result_Data_128_bytes_1[108] := HwInputs._10a1_Result_Data_128_bytes_1[108]; + PlcInputs._10a1_Result_Data_128_bytes_1[109] := HwInputs._10a1_Result_Data_128_bytes_1[109]; + PlcInputs._10a1_Result_Data_128_bytes_1[110] := HwInputs._10a1_Result_Data_128_bytes_1[110]; + PlcInputs._10a1_Result_Data_128_bytes_1[111] := HwInputs._10a1_Result_Data_128_bytes_1[111]; + PlcInputs._10a1_Result_Data_128_bytes_1[112] := HwInputs._10a1_Result_Data_128_bytes_1[112]; + PlcInputs._10a1_Result_Data_128_bytes_1[113] := HwInputs._10a1_Result_Data_128_bytes_1[113]; + PlcInputs._10a1_Result_Data_128_bytes_1[114] := HwInputs._10a1_Result_Data_128_bytes_1[114]; + PlcInputs._10a1_Result_Data_128_bytes_1[115] := HwInputs._10a1_Result_Data_128_bytes_1[115]; + PlcInputs._10a1_Result_Data_128_bytes_1[116] := HwInputs._10a1_Result_Data_128_bytes_1[116]; + PlcInputs._10a1_Result_Data_128_bytes_1[117] := HwInputs._10a1_Result_Data_128_bytes_1[117]; + PlcInputs._10a1_Result_Data_128_bytes_1[118] := HwInputs._10a1_Result_Data_128_bytes_1[118]; + PlcInputs._10a1_Result_Data_128_bytes_1[119] := HwInputs._10a1_Result_Data_128_bytes_1[119]; + PlcInputs._10a1_Result_Data_128_bytes_1[120] := HwInputs._10a1_Result_Data_128_bytes_1[120]; + PlcInputs._10a1_Result_Data_128_bytes_1[121] := HwInputs._10a1_Result_Data_128_bytes_1[121]; + PlcInputs._10a1_Result_Data_128_bytes_1[122] := HwInputs._10a1_Result_Data_128_bytes_1[122]; + PlcInputs._10a1_Result_Data_128_bytes_1[123] := HwInputs._10a1_Result_Data_128_bytes_1[123]; + PlcInputs._10a1_Result_Data_128_bytes_1[124] := HwInputs._10a1_Result_Data_128_bytes_1[124]; + PlcInputs._10a1_Result_Data_128_bytes_1[125] := HwInputs._10a1_Result_Data_128_bytes_1[125]; + PlcInputs._10a1_Result_Data_128_bytes_1[126] := HwInputs._10a1_Result_Data_128_bytes_1[126]; + PlcInputs._10a1_Result_Data_128_bytes_1[127] := HwInputs._10a1_Result_Data_128_bytes_1[127]; + PlcInputs._10a1_Result_Data_128_bytes_1[128] := HwInputs._10a1_Result_Data_128_bytes_1[128]; + PlcInputs._10a1_Result_Data_128_bytes_1[129] := HwInputs._10a1_Result_Data_128_bytes_1[129]; + PlcInputs._10a1_Result_Data_128_bytes_1[130] := HwInputs._10a1_Result_Data_128_bytes_1[130]; + PlcInputs._10a1_Result_Data_128_bytes_1[131] := HwInputs._10a1_Result_Data_128_bytes_1[131]; + PlcInputs._10a1_Result_Data_128_bytes_1[132] := HwInputs._10a1_Result_Data_128_bytes_1[132]; + PlcInputs._10a1_Result_Data_128_bytes_1[133] := HwInputs._10a1_Result_Data_128_bytes_1[133]; + PlcInputs._10a1_Result_Data_128_bytes_1[134] := HwInputs._10a1_Result_Data_128_bytes_1[134]; + PlcInputs._10a1_Result_Data_128_bytes_1[135] := HwInputs._10a1_Result_Data_128_bytes_1[135]; +END_FUNCTION diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st new file mode 100644 index 000000000..caf897994 --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st @@ -0,0 +1,210 @@ +FUNCTION CopyOutputs + VAR_EXTERNAL + HwOutputs : HwOutputs; + PlcOutputs : PlcOutputs; + END_VAR + HwOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1; + HwOutputs._12a1_Acquisition_Control_1 := PlcOutputs._12a1_Acquisition_Control_1; + HwOutputs._12a1_Inspection_Control_1 := PlcOutputs._12a1_Inspection_Control_1; + HwOutputs._12a1_Command_Control_1 := PlcOutputs._12a1_Command_Control_1; + HwOutputs._12a1_SoftEvent_Control_1 := PlcOutputs._12a1_SoftEvent_Control_1; + HwOutputs._12a1_User_Data_64_bytes_1[0] := PlcOutputs._12a1_User_Data_64_bytes_1[0]; + HwOutputs._12a1_User_Data_64_bytes_1[1] := PlcOutputs._12a1_User_Data_64_bytes_1[1]; + HwOutputs._12a1_User_Data_64_bytes_1[2] := PlcOutputs._12a1_User_Data_64_bytes_1[2]; + HwOutputs._12a1_User_Data_64_bytes_1[3] := PlcOutputs._12a1_User_Data_64_bytes_1[3]; + HwOutputs._12a1_User_Data_64_bytes_1[4] := PlcOutputs._12a1_User_Data_64_bytes_1[4]; + HwOutputs._12a1_User_Data_64_bytes_1[5] := PlcOutputs._12a1_User_Data_64_bytes_1[5]; + HwOutputs._12a1_User_Data_64_bytes_1[6] := PlcOutputs._12a1_User_Data_64_bytes_1[6]; + HwOutputs._12a1_User_Data_64_bytes_1[7] := PlcOutputs._12a1_User_Data_64_bytes_1[7]; + HwOutputs._12a1_User_Data_64_bytes_1[8] := PlcOutputs._12a1_User_Data_64_bytes_1[8]; + HwOutputs._12a1_User_Data_64_bytes_1[9] := PlcOutputs._12a1_User_Data_64_bytes_1[9]; + HwOutputs._12a1_User_Data_64_bytes_1[10] := PlcOutputs._12a1_User_Data_64_bytes_1[10]; + HwOutputs._12a1_User_Data_64_bytes_1[11] := PlcOutputs._12a1_User_Data_64_bytes_1[11]; + HwOutputs._12a1_User_Data_64_bytes_1[12] := PlcOutputs._12a1_User_Data_64_bytes_1[12]; + HwOutputs._12a1_User_Data_64_bytes_1[13] := PlcOutputs._12a1_User_Data_64_bytes_1[13]; + HwOutputs._12a1_User_Data_64_bytes_1[14] := PlcOutputs._12a1_User_Data_64_bytes_1[14]; + HwOutputs._12a1_User_Data_64_bytes_1[15] := PlcOutputs._12a1_User_Data_64_bytes_1[15]; + HwOutputs._12a1_User_Data_64_bytes_1[16] := PlcOutputs._12a1_User_Data_64_bytes_1[16]; + HwOutputs._12a1_User_Data_64_bytes_1[17] := PlcOutputs._12a1_User_Data_64_bytes_1[17]; + HwOutputs._12a1_User_Data_64_bytes_1[18] := PlcOutputs._12a1_User_Data_64_bytes_1[18]; + HwOutputs._12a1_User_Data_64_bytes_1[19] := PlcOutputs._12a1_User_Data_64_bytes_1[19]; + HwOutputs._12a1_User_Data_64_bytes_1[20] := PlcOutputs._12a1_User_Data_64_bytes_1[20]; + HwOutputs._12a1_User_Data_64_bytes_1[21] := PlcOutputs._12a1_User_Data_64_bytes_1[21]; + HwOutputs._12a1_User_Data_64_bytes_1[22] := PlcOutputs._12a1_User_Data_64_bytes_1[22]; + HwOutputs._12a1_User_Data_64_bytes_1[23] := PlcOutputs._12a1_User_Data_64_bytes_1[23]; + HwOutputs._12a1_User_Data_64_bytes_1[24] := PlcOutputs._12a1_User_Data_64_bytes_1[24]; + HwOutputs._12a1_User_Data_64_bytes_1[25] := PlcOutputs._12a1_User_Data_64_bytes_1[25]; + HwOutputs._12a1_User_Data_64_bytes_1[26] := PlcOutputs._12a1_User_Data_64_bytes_1[26]; + HwOutputs._12a1_User_Data_64_bytes_1[27] := PlcOutputs._12a1_User_Data_64_bytes_1[27]; + HwOutputs._12a1_User_Data_64_bytes_1[28] := PlcOutputs._12a1_User_Data_64_bytes_1[28]; + HwOutputs._12a1_User_Data_64_bytes_1[29] := PlcOutputs._12a1_User_Data_64_bytes_1[29]; + HwOutputs._12a1_User_Data_64_bytes_1[30] := PlcOutputs._12a1_User_Data_64_bytes_1[30]; + HwOutputs._12a1_User_Data_64_bytes_1[31] := PlcOutputs._12a1_User_Data_64_bytes_1[31]; + HwOutputs._12a1_User_Data_64_bytes_1[32] := PlcOutputs._12a1_User_Data_64_bytes_1[32]; + HwOutputs._12a1_User_Data_64_bytes_1[33] := PlcOutputs._12a1_User_Data_64_bytes_1[33]; + HwOutputs._12a1_User_Data_64_bytes_1[34] := PlcOutputs._12a1_User_Data_64_bytes_1[34]; + HwOutputs._12a1_User_Data_64_bytes_1[35] := PlcOutputs._12a1_User_Data_64_bytes_1[35]; + HwOutputs._12a1_User_Data_64_bytes_1[36] := PlcOutputs._12a1_User_Data_64_bytes_1[36]; + HwOutputs._12a1_User_Data_64_bytes_1[37] := PlcOutputs._12a1_User_Data_64_bytes_1[37]; + HwOutputs._12a1_User_Data_64_bytes_1[38] := PlcOutputs._12a1_User_Data_64_bytes_1[38]; + HwOutputs._12a1_User_Data_64_bytes_1[39] := PlcOutputs._12a1_User_Data_64_bytes_1[39]; + HwOutputs._12a1_User_Data_64_bytes_1[40] := PlcOutputs._12a1_User_Data_64_bytes_1[40]; + HwOutputs._12a1_User_Data_64_bytes_1[41] := PlcOutputs._12a1_User_Data_64_bytes_1[41]; + HwOutputs._12a1_User_Data_64_bytes_1[42] := PlcOutputs._12a1_User_Data_64_bytes_1[42]; + HwOutputs._12a1_User_Data_64_bytes_1[43] := PlcOutputs._12a1_User_Data_64_bytes_1[43]; + HwOutputs._12a1_User_Data_64_bytes_1[44] := PlcOutputs._12a1_User_Data_64_bytes_1[44]; + HwOutputs._12a1_User_Data_64_bytes_1[45] := PlcOutputs._12a1_User_Data_64_bytes_1[45]; + HwOutputs._12a1_User_Data_64_bytes_1[46] := PlcOutputs._12a1_User_Data_64_bytes_1[46]; + HwOutputs._12a1_User_Data_64_bytes_1[47] := PlcOutputs._12a1_User_Data_64_bytes_1[47]; + HwOutputs._12a1_User_Data_64_bytes_1[48] := PlcOutputs._12a1_User_Data_64_bytes_1[48]; + HwOutputs._12a1_User_Data_64_bytes_1[49] := PlcOutputs._12a1_User_Data_64_bytes_1[49]; + HwOutputs._12a1_User_Data_64_bytes_1[50] := PlcOutputs._12a1_User_Data_64_bytes_1[50]; + HwOutputs._12a1_User_Data_64_bytes_1[51] := PlcOutputs._12a1_User_Data_64_bytes_1[51]; + HwOutputs._12a1_User_Data_64_bytes_1[52] := PlcOutputs._12a1_User_Data_64_bytes_1[52]; + HwOutputs._12a1_User_Data_64_bytes_1[53] := PlcOutputs._12a1_User_Data_64_bytes_1[53]; + HwOutputs._12a1_User_Data_64_bytes_1[54] := PlcOutputs._12a1_User_Data_64_bytes_1[54]; + HwOutputs._12a1_User_Data_64_bytes_1[55] := PlcOutputs._12a1_User_Data_64_bytes_1[55]; + HwOutputs._12a1_User_Data_64_bytes_1[56] := PlcOutputs._12a1_User_Data_64_bytes_1[56]; + HwOutputs._12a1_User_Data_64_bytes_1[57] := PlcOutputs._12a1_User_Data_64_bytes_1[57]; + HwOutputs._12a1_User_Data_64_bytes_1[58] := PlcOutputs._12a1_User_Data_64_bytes_1[58]; + HwOutputs._12a1_User_Data_64_bytes_1[59] := PlcOutputs._12a1_User_Data_64_bytes_1[59]; + HwOutputs._12a1_User_Data_64_bytes_1[60] := PlcOutputs._12a1_User_Data_64_bytes_1[60]; + HwOutputs._12a1_User_Data_64_bytes_1[61] := PlcOutputs._12a1_User_Data_64_bytes_1[61]; + HwOutputs._12a1_User_Data_64_bytes_1[62] := PlcOutputs._12a1_User_Data_64_bytes_1[62]; + HwOutputs._12a1_User_Data_64_bytes_1[63] := PlcOutputs._12a1_User_Data_64_bytes_1[63]; + HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; + HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; + HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; + HwOutputs._10a1_User_Data_128_bytes_1[0] := PlcOutputs._10a1_User_Data_128_bytes_1[0]; + HwOutputs._10a1_User_Data_128_bytes_1[1] := PlcOutputs._10a1_User_Data_128_bytes_1[1]; + HwOutputs._10a1_User_Data_128_bytes_1[2] := PlcOutputs._10a1_User_Data_128_bytes_1[2]; + HwOutputs._10a1_User_Data_128_bytes_1[3] := PlcOutputs._10a1_User_Data_128_bytes_1[3]; + HwOutputs._10a1_User_Data_128_bytes_1[4] := PlcOutputs._10a1_User_Data_128_bytes_1[4]; + HwOutputs._10a1_User_Data_128_bytes_1[5] := PlcOutputs._10a1_User_Data_128_bytes_1[5]; + HwOutputs._10a1_User_Data_128_bytes_1[6] := PlcOutputs._10a1_User_Data_128_bytes_1[6]; + HwOutputs._10a1_User_Data_128_bytes_1[7] := PlcOutputs._10a1_User_Data_128_bytes_1[7]; + HwOutputs._10a1_User_Data_128_bytes_1[8] := PlcOutputs._10a1_User_Data_128_bytes_1[8]; + HwOutputs._10a1_User_Data_128_bytes_1[9] := PlcOutputs._10a1_User_Data_128_bytes_1[9]; + HwOutputs._10a1_User_Data_128_bytes_1[10] := PlcOutputs._10a1_User_Data_128_bytes_1[10]; + HwOutputs._10a1_User_Data_128_bytes_1[11] := PlcOutputs._10a1_User_Data_128_bytes_1[11]; + HwOutputs._10a1_User_Data_128_bytes_1[12] := PlcOutputs._10a1_User_Data_128_bytes_1[12]; + HwOutputs._10a1_User_Data_128_bytes_1[13] := PlcOutputs._10a1_User_Data_128_bytes_1[13]; + HwOutputs._10a1_User_Data_128_bytes_1[14] := PlcOutputs._10a1_User_Data_128_bytes_1[14]; + HwOutputs._10a1_User_Data_128_bytes_1[15] := PlcOutputs._10a1_User_Data_128_bytes_1[15]; + HwOutputs._10a1_User_Data_128_bytes_1[16] := PlcOutputs._10a1_User_Data_128_bytes_1[16]; + HwOutputs._10a1_User_Data_128_bytes_1[17] := PlcOutputs._10a1_User_Data_128_bytes_1[17]; + HwOutputs._10a1_User_Data_128_bytes_1[18] := PlcOutputs._10a1_User_Data_128_bytes_1[18]; + HwOutputs._10a1_User_Data_128_bytes_1[19] := PlcOutputs._10a1_User_Data_128_bytes_1[19]; + HwOutputs._10a1_User_Data_128_bytes_1[20] := PlcOutputs._10a1_User_Data_128_bytes_1[20]; + HwOutputs._10a1_User_Data_128_bytes_1[21] := PlcOutputs._10a1_User_Data_128_bytes_1[21]; + HwOutputs._10a1_User_Data_128_bytes_1[22] := PlcOutputs._10a1_User_Data_128_bytes_1[22]; + HwOutputs._10a1_User_Data_128_bytes_1[23] := PlcOutputs._10a1_User_Data_128_bytes_1[23]; + HwOutputs._10a1_User_Data_128_bytes_1[24] := PlcOutputs._10a1_User_Data_128_bytes_1[24]; + HwOutputs._10a1_User_Data_128_bytes_1[25] := PlcOutputs._10a1_User_Data_128_bytes_1[25]; + HwOutputs._10a1_User_Data_128_bytes_1[26] := PlcOutputs._10a1_User_Data_128_bytes_1[26]; + HwOutputs._10a1_User_Data_128_bytes_1[27] := PlcOutputs._10a1_User_Data_128_bytes_1[27]; + HwOutputs._10a1_User_Data_128_bytes_1[28] := PlcOutputs._10a1_User_Data_128_bytes_1[28]; + HwOutputs._10a1_User_Data_128_bytes_1[29] := PlcOutputs._10a1_User_Data_128_bytes_1[29]; + HwOutputs._10a1_User_Data_128_bytes_1[30] := PlcOutputs._10a1_User_Data_128_bytes_1[30]; + HwOutputs._10a1_User_Data_128_bytes_1[31] := PlcOutputs._10a1_User_Data_128_bytes_1[31]; + HwOutputs._10a1_User_Data_128_bytes_1[32] := PlcOutputs._10a1_User_Data_128_bytes_1[32]; + HwOutputs._10a1_User_Data_128_bytes_1[33] := PlcOutputs._10a1_User_Data_128_bytes_1[33]; + HwOutputs._10a1_User_Data_128_bytes_1[34] := PlcOutputs._10a1_User_Data_128_bytes_1[34]; + HwOutputs._10a1_User_Data_128_bytes_1[35] := PlcOutputs._10a1_User_Data_128_bytes_1[35]; + HwOutputs._10a1_User_Data_128_bytes_1[36] := PlcOutputs._10a1_User_Data_128_bytes_1[36]; + HwOutputs._10a1_User_Data_128_bytes_1[37] := PlcOutputs._10a1_User_Data_128_bytes_1[37]; + HwOutputs._10a1_User_Data_128_bytes_1[38] := PlcOutputs._10a1_User_Data_128_bytes_1[38]; + HwOutputs._10a1_User_Data_128_bytes_1[39] := PlcOutputs._10a1_User_Data_128_bytes_1[39]; + HwOutputs._10a1_User_Data_128_bytes_1[40] := PlcOutputs._10a1_User_Data_128_bytes_1[40]; + HwOutputs._10a1_User_Data_128_bytes_1[41] := PlcOutputs._10a1_User_Data_128_bytes_1[41]; + HwOutputs._10a1_User_Data_128_bytes_1[42] := PlcOutputs._10a1_User_Data_128_bytes_1[42]; + HwOutputs._10a1_User_Data_128_bytes_1[43] := PlcOutputs._10a1_User_Data_128_bytes_1[43]; + HwOutputs._10a1_User_Data_128_bytes_1[44] := PlcOutputs._10a1_User_Data_128_bytes_1[44]; + HwOutputs._10a1_User_Data_128_bytes_1[45] := PlcOutputs._10a1_User_Data_128_bytes_1[45]; + HwOutputs._10a1_User_Data_128_bytes_1[46] := PlcOutputs._10a1_User_Data_128_bytes_1[46]; + HwOutputs._10a1_User_Data_128_bytes_1[47] := PlcOutputs._10a1_User_Data_128_bytes_1[47]; + HwOutputs._10a1_User_Data_128_bytes_1[48] := PlcOutputs._10a1_User_Data_128_bytes_1[48]; + HwOutputs._10a1_User_Data_128_bytes_1[49] := PlcOutputs._10a1_User_Data_128_bytes_1[49]; + HwOutputs._10a1_User_Data_128_bytes_1[50] := PlcOutputs._10a1_User_Data_128_bytes_1[50]; + HwOutputs._10a1_User_Data_128_bytes_1[51] := PlcOutputs._10a1_User_Data_128_bytes_1[51]; + HwOutputs._10a1_User_Data_128_bytes_1[52] := PlcOutputs._10a1_User_Data_128_bytes_1[52]; + HwOutputs._10a1_User_Data_128_bytes_1[53] := PlcOutputs._10a1_User_Data_128_bytes_1[53]; + HwOutputs._10a1_User_Data_128_bytes_1[54] := PlcOutputs._10a1_User_Data_128_bytes_1[54]; + HwOutputs._10a1_User_Data_128_bytes_1[55] := PlcOutputs._10a1_User_Data_128_bytes_1[55]; + HwOutputs._10a1_User_Data_128_bytes_1[56] := PlcOutputs._10a1_User_Data_128_bytes_1[56]; + HwOutputs._10a1_User_Data_128_bytes_1[57] := PlcOutputs._10a1_User_Data_128_bytes_1[57]; + HwOutputs._10a1_User_Data_128_bytes_1[58] := PlcOutputs._10a1_User_Data_128_bytes_1[58]; + HwOutputs._10a1_User_Data_128_bytes_1[59] := PlcOutputs._10a1_User_Data_128_bytes_1[59]; + HwOutputs._10a1_User_Data_128_bytes_1[60] := PlcOutputs._10a1_User_Data_128_bytes_1[60]; + HwOutputs._10a1_User_Data_128_bytes_1[61] := PlcOutputs._10a1_User_Data_128_bytes_1[61]; + HwOutputs._10a1_User_Data_128_bytes_1[62] := PlcOutputs._10a1_User_Data_128_bytes_1[62]; + HwOutputs._10a1_User_Data_128_bytes_1[63] := PlcOutputs._10a1_User_Data_128_bytes_1[63]; + HwOutputs._10a1_User_Data_128_bytes_1[64] := PlcOutputs._10a1_User_Data_128_bytes_1[64]; + HwOutputs._10a1_User_Data_128_bytes_1[65] := PlcOutputs._10a1_User_Data_128_bytes_1[65]; + HwOutputs._10a1_User_Data_128_bytes_1[66] := PlcOutputs._10a1_User_Data_128_bytes_1[66]; + HwOutputs._10a1_User_Data_128_bytes_1[67] := PlcOutputs._10a1_User_Data_128_bytes_1[67]; + HwOutputs._10a1_User_Data_128_bytes_1[68] := PlcOutputs._10a1_User_Data_128_bytes_1[68]; + HwOutputs._10a1_User_Data_128_bytes_1[69] := PlcOutputs._10a1_User_Data_128_bytes_1[69]; + HwOutputs._10a1_User_Data_128_bytes_1[70] := PlcOutputs._10a1_User_Data_128_bytes_1[70]; + HwOutputs._10a1_User_Data_128_bytes_1[71] := PlcOutputs._10a1_User_Data_128_bytes_1[71]; + HwOutputs._10a1_User_Data_128_bytes_1[72] := PlcOutputs._10a1_User_Data_128_bytes_1[72]; + HwOutputs._10a1_User_Data_128_bytes_1[73] := PlcOutputs._10a1_User_Data_128_bytes_1[73]; + HwOutputs._10a1_User_Data_128_bytes_1[74] := PlcOutputs._10a1_User_Data_128_bytes_1[74]; + HwOutputs._10a1_User_Data_128_bytes_1[75] := PlcOutputs._10a1_User_Data_128_bytes_1[75]; + HwOutputs._10a1_User_Data_128_bytes_1[76] := PlcOutputs._10a1_User_Data_128_bytes_1[76]; + HwOutputs._10a1_User_Data_128_bytes_1[77] := PlcOutputs._10a1_User_Data_128_bytes_1[77]; + HwOutputs._10a1_User_Data_128_bytes_1[78] := PlcOutputs._10a1_User_Data_128_bytes_1[78]; + HwOutputs._10a1_User_Data_128_bytes_1[79] := PlcOutputs._10a1_User_Data_128_bytes_1[79]; + HwOutputs._10a1_User_Data_128_bytes_1[80] := PlcOutputs._10a1_User_Data_128_bytes_1[80]; + HwOutputs._10a1_User_Data_128_bytes_1[81] := PlcOutputs._10a1_User_Data_128_bytes_1[81]; + HwOutputs._10a1_User_Data_128_bytes_1[82] := PlcOutputs._10a1_User_Data_128_bytes_1[82]; + HwOutputs._10a1_User_Data_128_bytes_1[83] := PlcOutputs._10a1_User_Data_128_bytes_1[83]; + HwOutputs._10a1_User_Data_128_bytes_1[84] := PlcOutputs._10a1_User_Data_128_bytes_1[84]; + HwOutputs._10a1_User_Data_128_bytes_1[85] := PlcOutputs._10a1_User_Data_128_bytes_1[85]; + HwOutputs._10a1_User_Data_128_bytes_1[86] := PlcOutputs._10a1_User_Data_128_bytes_1[86]; + HwOutputs._10a1_User_Data_128_bytes_1[87] := PlcOutputs._10a1_User_Data_128_bytes_1[87]; + HwOutputs._10a1_User_Data_128_bytes_1[88] := PlcOutputs._10a1_User_Data_128_bytes_1[88]; + HwOutputs._10a1_User_Data_128_bytes_1[89] := PlcOutputs._10a1_User_Data_128_bytes_1[89]; + HwOutputs._10a1_User_Data_128_bytes_1[90] := PlcOutputs._10a1_User_Data_128_bytes_1[90]; + HwOutputs._10a1_User_Data_128_bytes_1[91] := PlcOutputs._10a1_User_Data_128_bytes_1[91]; + HwOutputs._10a1_User_Data_128_bytes_1[92] := PlcOutputs._10a1_User_Data_128_bytes_1[92]; + HwOutputs._10a1_User_Data_128_bytes_1[93] := PlcOutputs._10a1_User_Data_128_bytes_1[93]; + HwOutputs._10a1_User_Data_128_bytes_1[94] := PlcOutputs._10a1_User_Data_128_bytes_1[94]; + HwOutputs._10a1_User_Data_128_bytes_1[95] := PlcOutputs._10a1_User_Data_128_bytes_1[95]; + HwOutputs._10a1_User_Data_128_bytes_1[96] := PlcOutputs._10a1_User_Data_128_bytes_1[96]; + HwOutputs._10a1_User_Data_128_bytes_1[97] := PlcOutputs._10a1_User_Data_128_bytes_1[97]; + HwOutputs._10a1_User_Data_128_bytes_1[98] := PlcOutputs._10a1_User_Data_128_bytes_1[98]; + HwOutputs._10a1_User_Data_128_bytes_1[99] := PlcOutputs._10a1_User_Data_128_bytes_1[99]; + HwOutputs._10a1_User_Data_128_bytes_1[100] := PlcOutputs._10a1_User_Data_128_bytes_1[100]; + HwOutputs._10a1_User_Data_128_bytes_1[101] := PlcOutputs._10a1_User_Data_128_bytes_1[101]; + HwOutputs._10a1_User_Data_128_bytes_1[102] := PlcOutputs._10a1_User_Data_128_bytes_1[102]; + HwOutputs._10a1_User_Data_128_bytes_1[103] := PlcOutputs._10a1_User_Data_128_bytes_1[103]; + HwOutputs._10a1_User_Data_128_bytes_1[104] := PlcOutputs._10a1_User_Data_128_bytes_1[104]; + HwOutputs._10a1_User_Data_128_bytes_1[105] := PlcOutputs._10a1_User_Data_128_bytes_1[105]; + HwOutputs._10a1_User_Data_128_bytes_1[106] := PlcOutputs._10a1_User_Data_128_bytes_1[106]; + HwOutputs._10a1_User_Data_128_bytes_1[107] := PlcOutputs._10a1_User_Data_128_bytes_1[107]; + HwOutputs._10a1_User_Data_128_bytes_1[108] := PlcOutputs._10a1_User_Data_128_bytes_1[108]; + HwOutputs._10a1_User_Data_128_bytes_1[109] := PlcOutputs._10a1_User_Data_128_bytes_1[109]; + HwOutputs._10a1_User_Data_128_bytes_1[110] := PlcOutputs._10a1_User_Data_128_bytes_1[110]; + HwOutputs._10a1_User_Data_128_bytes_1[111] := PlcOutputs._10a1_User_Data_128_bytes_1[111]; + HwOutputs._10a1_User_Data_128_bytes_1[112] := PlcOutputs._10a1_User_Data_128_bytes_1[112]; + HwOutputs._10a1_User_Data_128_bytes_1[113] := PlcOutputs._10a1_User_Data_128_bytes_1[113]; + HwOutputs._10a1_User_Data_128_bytes_1[114] := PlcOutputs._10a1_User_Data_128_bytes_1[114]; + HwOutputs._10a1_User_Data_128_bytes_1[115] := PlcOutputs._10a1_User_Data_128_bytes_1[115]; + HwOutputs._10a1_User_Data_128_bytes_1[116] := PlcOutputs._10a1_User_Data_128_bytes_1[116]; + HwOutputs._10a1_User_Data_128_bytes_1[117] := PlcOutputs._10a1_User_Data_128_bytes_1[117]; + HwOutputs._10a1_User_Data_128_bytes_1[118] := PlcOutputs._10a1_User_Data_128_bytes_1[118]; + HwOutputs._10a1_User_Data_128_bytes_1[119] := PlcOutputs._10a1_User_Data_128_bytes_1[119]; + HwOutputs._10a1_User_Data_128_bytes_1[120] := PlcOutputs._10a1_User_Data_128_bytes_1[120]; + HwOutputs._10a1_User_Data_128_bytes_1[121] := PlcOutputs._10a1_User_Data_128_bytes_1[121]; + HwOutputs._10a1_User_Data_128_bytes_1[122] := PlcOutputs._10a1_User_Data_128_bytes_1[122]; + HwOutputs._10a1_User_Data_128_bytes_1[123] := PlcOutputs._10a1_User_Data_128_bytes_1[123]; + HwOutputs._10a1_User_Data_128_bytes_1[124] := PlcOutputs._10a1_User_Data_128_bytes_1[124]; + HwOutputs._10a1_User_Data_128_bytes_1[125] := PlcOutputs._10a1_User_Data_128_bytes_1[125]; + HwOutputs._10a1_User_Data_128_bytes_1[126] := PlcOutputs._10a1_User_Data_128_bytes_1[126]; + HwOutputs._10a1_User_Data_128_bytes_1[127] := PlcOutputs._10a1_User_Data_128_bytes_1[127]; + HwOutputs._10a1_User_Data_128_bytes_1[128] := PlcOutputs._10a1_User_Data_128_bytes_1[128]; + HwOutputs._10a1_User_Data_128_bytes_1[129] := PlcOutputs._10a1_User_Data_128_bytes_1[129]; + HwOutputs._10a1_User_Data_128_bytes_1[130] := PlcOutputs._10a1_User_Data_128_bytes_1[130]; + HwOutputs._10a1_User_Data_128_bytes_1[131] := PlcOutputs._10a1_User_Data_128_bytes_1[131]; +END_FUNCTION diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st new file mode 100644 index 000000000..9dfa1760b --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st @@ -0,0 +1,15 @@ +TYPE + HwInputs : STRUCT + _11a1_DI_8x24VDC_ST_1 AT %B0 : BYTE; + _11a1_DI_8x24VDC_ST_2 AT %B1 : BYTE; + _12a1_Acquisition_Status_1 AT %B2 : ARRAY[0..2] OF BYTE; + _12a1_Inspection_Status_1 AT %B5 : DWORD; + _12a1_Command_Control_1 AT %B9 : WORD; + _12a1_SoftEvent_Control_1 AT %B11 : BYTE; + _12a1_Results_64_bytes_1 AT %B12 : ARRAY[0..67] OF BYTE; + _10a1_Acquisition_Status_1 AT %B80 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 AT %B83 : BYTE; + _10a1_Soft_Event_Control_1 AT %B84 : BYTE; + _10a1_Result_Data_128_bytes_1 AT %B85 : ARRAY[0..135] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st new file mode 100644 index 000000000..97d565aed --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st @@ -0,0 +1,14 @@ +TYPE + HwOutputs : STRUCT + _11a1_DQ_8x24VDC_0_5A_ST_1 AT %B0 : BYTE; + _12a1_Acquisition_Control_1 AT %B1 : BYTE; + _12a1_Inspection_Control_1 AT %B2 : BYTE; + _12a1_Command_Control_1 AT %B3 : WORD; + _12a1_SoftEvent_Control_1 AT %B5 : BYTE; + _12a1_User_Data_64_bytes_1 AT %B6 : ARRAY[0..63] OF BYTE; + _10a1_Acquisition_Control_1 AT %B70 : BYTE; + _10a1_Results_Control_1 AT %B71 : BYTE; + _10a1_Soft_Event_Control_1 AT %B72 : BYTE; + _10a1_User_Data_128_bytes_1 AT %B73 : ARRAY[0..131] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st new file mode 100644 index 000000000..7fe1d3a2a --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st @@ -0,0 +1,15 @@ +TYPE + PlcInputs : STRUCT + _11a1_DI_8x24VDC_ST_1 : BYTE; + _11a1_DI_8x24VDC_ST_2 : BYTE; + _12a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _12a1_Inspection_Status_1 : DWORD; + _12a1_Command_Control_1 : WORD; + _12a1_SoftEvent_Control_1 : BYTE; + _12a1_Results_64_bytes_1 : ARRAY[0..67] OF BYTE; + _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st new file mode 100644 index 000000000..2ea4d4ab4 --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st @@ -0,0 +1,14 @@ +TYPE + PlcOutputs : STRUCT + _11a1_DQ_8x24VDC_0_5A_ST_1 : BYTE; + _12a1_Acquisition_Control_1 : BYTE; + _12a1_Inspection_Control_1 : BYTE; + _12a1_Command_Control_1 : WORD; + _12a1_SoftEvent_Control_1 : BYTE; + _12a1_User_Data_64_bytes_1 : ARRAY[0..63] OF BYTE; + _10a1_Acquisition_Control_1 : BYTE; + _10a1_Results_Control_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + END_STRUCT; +END_TYPE diff --git a/src/integrations/ctrl/src/configuration.st b/src/integrations/ctrl/src/configuration.st index 697f71973..723e41805 100644 --- a/src/integrations/ctrl/src/configuration.st +++ b/src/integrations/ctrl/src/configuration.st @@ -26,6 +26,8 @@ CONFIGURATION MyConfiguration AxoMessengersDocu : AxoStaticMessengerDocuExample.Messengers; AxoRtc : AxoRtc.AxoS71500Rtc; AxoDataFragmentExchangeContext : AxoDataFramentsExchangeDocuExample.AxoDataFragmentExchangeContext; + AxoCognexVisionDatamanExampleContext : AxoCognexVisionDatamanExamples.AxoCognexVisionDatamanExampleContext; + process_data_manager: AxoDataExamples.AxoProcessDataManager; test_data_manager: AxoDataExamples.AxoTestDataManager; AxoLoggers : AxoLoggerExamples.Loggers; @@ -35,4 +37,14 @@ CONFIGURATION MyConfiguration // Integration tests Integrations : IntegrationTests.Integrations; END_VAR + + //Copy this VAR_GLOBAL section into your configuration file inside your project. + //Do not change any names, addresses or any another content. + VAR_GLOBAL + HwInputs AT %IB0 : HwInputs; + HwOutputs AT %QB0 : HwOutputs; + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR + END_CONFIGURATION diff --git a/src/integrations/ctrl/src/program.st b/src/integrations/ctrl/src/program.st index 1cff27b03..1d393c140 100644 --- a/src/integrations/ctrl/src/program.st +++ b/src/integrations/ctrl/src/program.st @@ -22,6 +22,7 @@ PROGRAM MyProgram AxoMessengersDocu : AxoStaticMessengerDocuExample.Messengers; AxoDataFragmentExchangeContext : AxoDataFramentsExchangeDocuExample.AxoDataFragmentExchangeContext; + AxoCognexVisionDatamanExampleContext : AxoCognexVisionDatamanExamples.AxoCognexVisionDatamanExampleContext; AxoLoggers : AxoLoggerExamples.Loggers; @@ -30,6 +31,17 @@ PROGRAM MyProgram AxoRtc : AxoRtc.AxoS71500Rtc; END_VAR + + //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. + //Do not change any names, addresses or any another content. + VAR_EXTERNAL + PlcInputs : PlcInputs; + PlcOutputs : PlcOutputs; + END_VAR + //Copy this function call at the very beginning of your program. + //Do not change any names, addresses or any another content. + CopyInputs(); + I_am_alive := I_am_alive + ULINT#1; MainContext.Run(); @@ -50,11 +62,19 @@ PROGRAM MyProgram AxoMessengersDocu.Run(); AxoMessengersDocu.InjectRtc(AxoRtc); AxoDataFragmentExchangeContext.Run(); + + AxoCognexVisionDatamanExampleContext.PlcInputs := PlcInputs; + AxoCognexVisionDatamanExampleContext.PlcOutputs := PlcOutputs; + AxoCognexVisionDatamanExampleContext.Run(); + AxoLoggers.InjectRtc(AxoRtc); AxoLoggers.Run(); // Integration tests Integrations.Run(); - + + //Copy this function call at the very end of your program. + //Do not change any names, addresses or any another content. + CopyOutputs(); END_PROGRAM @@ -97,3 +117,20 @@ CLASS MyContext EXTENDS AxoContext END_METHOD END_CLASS + + + + // Context.Inputs := REF(Inputs); + // Context.Outputs := REF(Outputs); + // Context.PlcInputs := REF(PlcInputs); + // Context.PlcOutputs := REF(PlcOutputs); + + + // ContextLogger.SetMinimumLevel(AXOpen.Logging.eLogLevel#Verbose); + // Context.InjectRtc(S71500Rtc); + // Context.InjectLogger(ContextLogger); + // // Executes the main context of this application. + // Context.Run(); + + +// END_PROGRAM diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor new file mode 100644 index 000000000..cb9a8f7c7 --- /dev/null +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor @@ -0,0 +1,27 @@ +@page "/AxoCognexVisionDatamanExample" +@using axopen_integrations +@using AXOpen.Core; +@using AXOpen.Cognex.Vision.v_6_0_0_0; + +

AxoCognexVisionDatamanExample

+ +
+
+ AxoCognexVisionDataman +
+
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+ diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor index bc8f94335..22f074c46 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor @@ -78,7 +78,7 @@ AxoDataFragmentsRemote - + + diff --git a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj index 6f12ece2a..6521f727d 100644 --- a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj +++ b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj @@ -24,6 +24,7 @@ + diff --git a/src/templates.simple/ctrl/.config/dotnet-tools.json b/src/templates.simple/ctrl/.config/dotnet-tools.json new file mode 100644 index 000000000..67cb08dcd --- /dev/null +++ b/src/templates.simple/ctrl/.config/dotnet-tools.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "axsharp.ixc": { + "version": "0.14.0-alpha.113", + "commands": [ + "ixc" + ] + }, + "axsharp.ixr": { + "version": "0.14.0-alpha.113", + "commands": [ + "ixr" + ] + } + } +} \ No newline at end of file diff --git a/src/utils/ctrl/src/AXOpenUtils/AxoCRC_16.st b/src/utils/ctrl/src/AXOpenUtils/AxoCRC_16.st index b01636c4d..567abb817 100644 --- a/src/utils/ctrl/src/AXOpenUtils/AxoCRC_16.st +++ b/src/utils/ctrl/src/AXOpenUtils/AxoCRC_16.st @@ -43,7 +43,7 @@ NAMESPACE AXOpen.Utils END_IF; FOR i := UINT#1 TO maxIndex BY UINT#1 DO - crc := AxoXor(SHL(crc, UINT#8),CRC_TABLE[TO_INT(AxoXor(SHR(crc, UINT#8) , serialized[i]))]); + crc :=SHL(crc, UINT#8) XOR CRC_TABLE[TO_INT(SHR(crc, UINT#8) XOR serialized[i])]; END_FOR; AxoCRC_16 := crc; diff --git a/src/utils/ctrl/src/AXOpenUtils/AxoCRC_32.st b/src/utils/ctrl/src/AXOpenUtils/AxoCRC_32.st index 26eb790c1..587c8e3c3 100644 --- a/src/utils/ctrl/src/AXOpenUtils/AxoCRC_32.st +++ b/src/utils/ctrl/src/AXOpenUtils/AxoCRC_32.st @@ -43,7 +43,7 @@ NAMESPACE AXOpen.Utils END_IF; FOR i := UINT#1 TO maxIndex BY UINT#1 DO - crc := AxoXor(SHL(crc, UINT#8),CRC_TABLE[TO_INT(AxoXor(SHR(crc, UINT#24) , serialized[i]))]); + crc := SHL(crc, UINT#8) XOR CRC_TABLE[TO_INT(SHR(crc, UINT#24) XOR serialized[i])]; END_FOR; AxoCRC_32 := crc; diff --git a/src/utils/ctrl/src/AXOpenUtils/AxoCRC_8.st b/src/utils/ctrl/src/AXOpenUtils/AxoCRC_8.st index 8e148a8e4..3da65f490 100644 --- a/src/utils/ctrl/src/AXOpenUtils/AxoCRC_8.st +++ b/src/utils/ctrl/src/AXOpenUtils/AxoCRC_8.st @@ -43,7 +43,7 @@ NAMESPACE AXOpen.Utils END_IF; FOR i := UINT#1 TO maxIndex BY UINT#1 DO - crc := CRC_TABLE[TO_INT(AxoXor(crc , TO_BYTE(TO_CHAR(serialized[i]))))]; + crc := CRC_TABLE[TO_INT(crc XOR TO_BYTE(TO_CHAR(serialized[i])))]; END_FOR; AxoCRC_8 := crc; END_FUNCTION diff --git a/src/utils/ctrl/src/AXOpenUtils/AxoXORs.st b/src/utils/ctrl/src/AXOpenUtils/AxoXORs.st deleted file mode 100644 index c8ca3fcc3..000000000 --- a/src/utils/ctrl/src/AXOpenUtils/AxoXORs.st +++ /dev/null @@ -1,200 +0,0 @@ - -NAMESPACE AXOpen.Utils - FUNCTION AxoXor : BYTE - VAR_INPUT - In1 : BYTE; - In2 : BYTE; - END_VAR - VAR_TEMP - retval : BYTE; - i : USINT; - END_VAR - retval := BYTE#0; - - // TODO check the performance of both principles - // FOR i := USINT#0 TO USINT#7 DO - // SetBit(retval,i,GetBit(In1,i) XOR GetBit(In2,i)); - // END_FOR; - - retval.%X0 := In1.%X0 XOR In2.%X0 ; - retval.%X1 := In1.%X1 XOR In2.%X1 ; - retval.%X2 := In1.%X2 XOR In2.%X2 ; - retval.%X3 := In1.%X3 XOR In2.%X3 ; - retval.%X4 := In1.%X4 XOR In2.%X4 ; - retval.%X5 := In1.%X5 XOR In2.%X5 ; - retval.%X6 := In1.%X6 XOR In2.%X6 ; - retval.%X7 := In1.%X7 XOR In2.%X7 ; - - AxoXor := retval; - END_FUNCTION - - FUNCTION AxoXor : WORD - VAR_INPUT - In1 : WORD; - In2 : WORD; - END_VAR - VAR_TEMP - retval : WORD; - i : USINT; - END_VAR - retval := WORD#0; - - // TODO check the performance of both principles - // FOR i := USINT#0 TO USINT#15 DO - // SetBit(retval,i,GetBit(In1,i) XOR GetBit(In2,i)); - // END_FOR; - - retval.%X0 := In1.%X0 XOR In2.%X0 ; - retval.%X1 := In1.%X1 XOR In2.%X1 ; - retval.%X2 := In1.%X2 XOR In2.%X2 ; - retval.%X3 := In1.%X3 XOR In2.%X3 ; - retval.%X4 := In1.%X4 XOR In2.%X4 ; - retval.%X5 := In1.%X5 XOR In2.%X5 ; - retval.%X6 := In1.%X6 XOR In2.%X6 ; - retval.%X7 := In1.%X7 XOR In2.%X7 ; - retval.%X8 := In1.%X8 XOR In2.%X8 ; - retval.%X9 := In1.%X9 XOR In2.%X9 ; - retval.%X10 := In1.%X10 XOR In2.%X10 ; - retval.%X11 := In1.%X11 XOR In2.%X11 ; - retval.%X12 := In1.%X12 XOR In2.%X12 ; - retval.%X13 := In1.%X13 XOR In2.%X13 ; - retval.%X14 := In1.%X14 XOR In2.%X14 ; - retval.%X15 := In1.%X15 XOR In2.%X15 ; - - AxoXor := retval; - END_FUNCTION - - FUNCTION AxoXor : DWORD - VAR_INPUT - In1 : DWORD; - In2 : DWORD; - END_VAR - VAR_TEMP - retval : DWORD; - i : USINT; - END_VAR - retval := DWORD#0; - - // TODO check the performance of both principles - // FOR i := USINT#0 TO USINT#31 DO - // SetBit(retval,i,GetBit(In1,i) XOR GetBit(In2,i)); - // END_FOR; - - retval.%X0 := In1.%X0 XOR In2.%X0 ; - retval.%X1 := In1.%X1 XOR In2.%X1 ; - retval.%X2 := In1.%X2 XOR In2.%X2 ; - retval.%X3 := In1.%X3 XOR In2.%X3 ; - retval.%X4 := In1.%X4 XOR In2.%X4 ; - retval.%X5 := In1.%X5 XOR In2.%X5 ; - retval.%X6 := In1.%X6 XOR In2.%X6 ; - retval.%X7 := In1.%X7 XOR In2.%X7 ; - retval.%X8 := In1.%X8 XOR In2.%X8 ; - retval.%X9 := In1.%X9 XOR In2.%X9 ; - retval.%X10 := In1.%X10 XOR In2.%X10 ; - retval.%X11 := In1.%X11 XOR In2.%X11 ; - retval.%X12 := In1.%X12 XOR In2.%X12 ; - retval.%X13 := In1.%X13 XOR In2.%X13 ; - retval.%X14 := In1.%X14 XOR In2.%X14 ; - retval.%X15 := In1.%X15 XOR In2.%X15 ; - retval.%X16 := In1.%X16 XOR In2.%X16 ; - retval.%X17 := In1.%X17 XOR In2.%X17 ; - retval.%X18 := In1.%X18 XOR In2.%X18 ; - retval.%X19 := In1.%X19 XOR In2.%X19 ; - retval.%X20 := In1.%X20 XOR In2.%X20 ; - retval.%X21 := In1.%X21 XOR In2.%X21 ; - retval.%X22 := In1.%X22 XOR In2.%X22 ; - retval.%X23 := In1.%X23 XOR In2.%X23 ; - retval.%X24 := In1.%X24 XOR In2.%X24 ; - retval.%X25 := In1.%X25 XOR In2.%X25 ; - retval.%X26 := In1.%X26 XOR In2.%X26 ; - retval.%X27 := In1.%X27 XOR In2.%X27 ; - retval.%X28 := In1.%X28 XOR In2.%X28 ; - retval.%X29 := In1.%X29 XOR In2.%X29 ; - retval.%X30 := In1.%X30 XOR In2.%X30 ; - retval.%X31 := In1.%X31 XOR In2.%X31 ; - AxoXor := retval; - END_FUNCTION - - FUNCTION AxoXor : LWORD - VAR_INPUT - In1 : LWORD; - In2 : LWORD; - END_VAR - VAR_TEMP - retval : LWORD; - i : USINT; - END_VAR - retval := LWORD#0; - - // TODO check the performance of both principles - // FOR i := USINT#0 TO USINT#63 DO - // SetBit(retval,i,GetBit(In1,i) XOR GetBit(In2,i)); - // END_FOR; - - retval.%X0 := In1.%X0 XOR In2.%X0 ; - retval.%X1 := In1.%X1 XOR In2.%X1 ; - retval.%X2 := In1.%X2 XOR In2.%X2 ; - retval.%X3 := In1.%X3 XOR In2.%X3 ; - retval.%X4 := In1.%X4 XOR In2.%X4 ; - retval.%X5 := In1.%X5 XOR In2.%X5 ; - retval.%X6 := In1.%X6 XOR In2.%X6 ; - retval.%X7 := In1.%X7 XOR In2.%X7 ; - retval.%X8 := In1.%X8 XOR In2.%X8 ; - retval.%X9 := In1.%X9 XOR In2.%X9 ; - retval.%X10 := In1.%X10 XOR In2.%X10 ; - retval.%X11 := In1.%X11 XOR In2.%X11 ; - retval.%X12 := In1.%X12 XOR In2.%X12 ; - retval.%X13 := In1.%X13 XOR In2.%X13 ; - retval.%X14 := In1.%X14 XOR In2.%X14 ; - retval.%X15 := In1.%X15 XOR In2.%X15 ; - retval.%X16 := In1.%X16 XOR In2.%X16 ; - retval.%X17 := In1.%X17 XOR In2.%X17 ; - retval.%X18 := In1.%X18 XOR In2.%X18 ; - retval.%X19 := In1.%X19 XOR In2.%X19 ; - retval.%X20 := In1.%X20 XOR In2.%X20 ; - retval.%X21 := In1.%X21 XOR In2.%X21 ; - retval.%X22 := In1.%X22 XOR In2.%X22 ; - retval.%X23 := In1.%X23 XOR In2.%X23 ; - retval.%X24 := In1.%X24 XOR In2.%X24 ; - retval.%X25 := In1.%X25 XOR In2.%X25 ; - retval.%X26 := In1.%X26 XOR In2.%X26 ; - retval.%X27 := In1.%X27 XOR In2.%X27 ; - retval.%X28 := In1.%X28 XOR In2.%X28 ; - retval.%X29 := In1.%X29 XOR In2.%X29 ; - retval.%X30 := In1.%X30 XOR In2.%X30 ; - retval.%X31 := In1.%X31 XOR In2.%X31 ; - retval.%X32 := In1.%X32 XOR In2.%X32 ; - retval.%X33 := In1.%X33 XOR In2.%X33 ; - retval.%X34 := In1.%X34 XOR In2.%X34 ; - retval.%X35 := In1.%X35 XOR In2.%X35 ; - retval.%X36 := In1.%X36 XOR In2.%X36 ; - retval.%X37 := In1.%X37 XOR In2.%X37 ; - retval.%X38 := In1.%X38 XOR In2.%X38 ; - retval.%X39 := In1.%X39 XOR In2.%X39 ; - retval.%X40 := In1.%X40 XOR In2.%X40 ; - retval.%X41 := In1.%X41 XOR In2.%X41 ; - retval.%X42 := In1.%X42 XOR In2.%X42 ; - retval.%X43 := In1.%X43 XOR In2.%X43 ; - retval.%X44 := In1.%X44 XOR In2.%X44 ; - retval.%X45 := In1.%X45 XOR In2.%X45 ; - retval.%X46 := In1.%X46 XOR In2.%X46 ; - retval.%X47 := In1.%X47 XOR In2.%X47 ; - retval.%X48 := In1.%X48 XOR In2.%X48 ; - retval.%X49 := In1.%X49 XOR In2.%X49 ; - retval.%X50 := In1.%X50 XOR In2.%X50 ; - retval.%X51 := In1.%X51 XOR In2.%X51 ; - retval.%X52 := In1.%X52 XOR In2.%X52 ; - retval.%X53 := In1.%X53 XOR In2.%X53 ; - retval.%X54 := In1.%X54 XOR In2.%X54 ; - retval.%X55 := In1.%X55 XOR In2.%X55 ; - retval.%X56 := In1.%X56 XOR In2.%X56 ; - retval.%X57 := In1.%X57 XOR In2.%X57 ; - retval.%X58 := In1.%X58 XOR In2.%X58 ; - retval.%X59 := In1.%X59 XOR In2.%X59 ; - retval.%X60 := In1.%X60 XOR In2.%X60 ; - retval.%X61 := In1.%X61 XOR In2.%X61 ; - retval.%X62 := In1.%X62 XOR In2.%X62 ; - retval.%X63 := In1.%X63 XOR In2.%X63 ; - AxoXor := retval; - END_FUNCTION -END_NAMESPACE \ No newline at end of file diff --git a/src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToDint.st b/src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToDint.st new file mode 100644 index 000000000..8e73be481 --- /dev/null +++ b/src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToDint.st @@ -0,0 +1,21 @@ +USING System.SerDe; + +NAMESPACE AXOpen.Utils + FUNCTION AxoBytesToDint : DINT + VAR_INPUT + inFormat : Endianness; + inByte0: BYTE; + inByte1: BYTE; + inByte2: BYTE; + inByte3: BYTE; + END_VAR + + + IF inFormat=Endianness#Little THEN + AxoBytesToDint := TO_DINT(SHL(SHL(SHL(TO_DWORD(inByte3), UINT#8) OR inByte2,UINT#8) OR inByte1,UINT#8) OR inByte0); + ELSIF inFormat=Endianness#Big THEN + AxoBytesToDint := TO_DINT(SHL(SHL(SHL(TO_DWORD(inByte0), UINT#8) OR inByte1,UINT#8) OR inByte2,UINT#8) OR inByte3); + END_IF; + END_FUNCTION + +END_NAMESPACE \ No newline at end of file diff --git a/src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToInt.st b/src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToInt.st new file mode 100644 index 000000000..6bb59ab75 --- /dev/null +++ b/src/utils/ctrl/src/Conversions/FromBytes/AxoBytesToInt.st @@ -0,0 +1,18 @@ +USING System.SerDe; + +NAMESPACE AXOpen.Utils + FUNCTION AxoBytesToInt : DINT + VAR_INPUT + inFormat : Endianness; + inByte0: BYTE; + inByte1: BYTE; + END_VAR + + IF inFormat=Endianness#Little THEN + AxoBytesToInt := TO_INT(SHL(TO_WORD(inByte1),UINT#8) OR inByte0); + ELSIF inFormat=Endianness#Big THEN + AxoBytesToInt := TO_INT(SHL(TO_WORD(inByte0),UINT#8) OR inByte1); + END_IF; + END_FUNCTION + +END_NAMESPACE \ No newline at end of file diff --git a/src/utils/ctrl/test/Conversions/AxoConversions_UnitTests.st b/src/utils/ctrl/test/Conversions/AxoConversions_UnitTests.st new file mode 100644 index 000000000..cd91cff56 --- /dev/null +++ b/src/utils/ctrl/test/Conversions/AxoConversions_UnitTests.st @@ -0,0 +1,33 @@ +USING AxUnit; +USING AXOpen.Utils; +USING System.SerDe; + +NAMESPACE AXOpen.Utils.Unit_Tests + {TestFixture} + CLASS AxoConversions_UnitTests + {Test} + METHOD PUBLIC should_be_305419896_decimal + Assert.Equal(DINT#305419896, AxoBytesToDint(Endianness#Big,Byte#16#12,Byte#16#34,Byte#16#56,Byte#16#78)); + Assert.Equal(DINT#305419896, AxoBytesToDint(Endianness#Little,Byte#16#78,Byte#16#56,Byte#16#34,Byte#16#12)); + END_METHOD + + {Test} + METHOD PUBLIC should_be_2018915346_decimal + Assert.Equal(DINT#2018915346, AxoBytesToDint(Endianness#Little,Byte#16#12,Byte#16#34,Byte#16#56,Byte#16#78)); + Assert.Equal(DINT#2018915346, AxoBytesToDint(Endianness#Big,Byte#16#78,Byte#16#56,Byte#16#34,Byte#16#12)); + END_METHOD + + {Test} + METHOD PUBLIC should_be_4660_decimal + Assert.Equal(INT#4660, AxoBytesToInt(Endianness#Big,Byte#16#12,Byte#16#34)); + Assert.Equal(INT#4660, AxoBytesToInt(Endianness#Little,Byte#16#34,Byte#16#12)); + END_METHOD + + + {Test} + METHOD PUBLIC should_be_13330_decimal + Assert.Equal(INT#13330, AxoBytesToInt(Endianness#Little,Byte#16#12,Byte#16#34)); + Assert.Equal(INT#13330, AxoBytesToInt(Endianness#Big,Byte#16#34,Byte#16#12)); + END_METHOD + END_CLASS +END_NAMESPACE diff --git a/src/ws.code-workspace b/src/ws.code-workspace deleted file mode 100644 index b0feb9430..000000000 --- a/src/ws.code-workspace +++ /dev/null @@ -1,37 +0,0 @@ -{ - "folders": [ - { - "name": "templates.simple", - "path": "templates.simple/ctrl" - }, - { - "name": "core", - "path": "core/ctrl" - }, - { - "name": "integrations", - "path": "integrations/ctrl" - }, - { - "name": "simatic1500", - "path": "simatic1500/ctrl" - }, - { - "name": "utils", - "path": "utils/ctrl" - }, - { - "name": "data", - "path": "data/ctrl" - }, - { - "name": "probers", - "path": "probers/ctrl" - }, - { - "name": "abstractions", - "path": "abstractions/ctrl" - } - ], - "settings": {} -} \ No newline at end of file From 6dd28b4c871d867a08a47cdeb702289c78c4a035 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 27 Jul 2023 09:29:14 +0200 Subject: [PATCH 04/32] update packages --- .../axopen_cognex_vision_blazor.csproj | 4 ++-- .../AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj | 6 +++--- .../axopen_components_abstractions_blazor.csproj | 4 ++-- .../ix_ax_axopen_components_abstractions.csproj | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj index 980278f6d..32d5db5cd 100644 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj @@ -19,8 +19,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj index a22929a50..a78047f4b 100644 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj @@ -10,9 +10,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj index 239acfdbf..9dba42de0 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj @@ -23,8 +23,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj index 6e899e4ae..28293d4b0 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + From ce100af40bc763fcb4e0c98f523da2a1f743b118 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Thu, 27 Jul 2023 15:54:08 +0200 Subject: [PATCH 05/32] wip --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 1 + src/integrations/ctrl/default.mon | 21 +++-- src/integrations/ctrl/raw_hw.mon | 8 ++ src/integrations/ctrl/raw_plc.mon | 13 +++ .../AX_Plc1516V3_CognexDataman.zap18 | Bin 0 -> 474394 bytes .../AxoCognexVisionDatamanExample.st | 20 ++--- .../AXOpen.Cognex.Vision/IO/CopyInputs.st | 76 ------------------ .../AXOpen.Cognex.Vision/IO/CopyOutputs.st | 69 ---------------- .../AXOpen.Cognex.Vision/IO/HwInputs.st | 15 +--- .../AXOpen.Cognex.Vision/IO/HwOutputs.st | 14 +--- .../AXOpen.Cognex.Vision/IO/PlcInputs.st | 15 +--- .../AXOpen.Cognex.Vision/IO/PlcOutputs.st | 14 +--- src/integrations/ctrl/src/program.st | 21 +---- 13 files changed, 63 insertions(+), 224 deletions(-) create mode 100644 src/integrations/ctrl/raw_hw.mon create mode 100644 src/integrations/ctrl/raw_plc.mon create mode 100644 src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AX_Plc1516V3_CognexDataman.zap18 diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 33165fce3..bfba34167 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -11,6 +11,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _readTask : AxoDatamanRead; {#ix-attr:[ComponentHeader()]} {#ix-attr:[ReadOnly()]} + {#ix-attr:[RenderIgnore()]} {#ix-set:AttributeName = "<#Results#>"} Results : AxoDataman_Results; diff --git a/src/integrations/ctrl/default.mon b/src/integrations/ctrl/default.mon index 716925bb6..6ff8e23af 100644 --- a/src/integrations/ctrl/default.mon +++ b/src/integrations/ctrl/default.mon @@ -1,8 +1,13 @@ -I_am_alive -AxoMessengers._messenger1.Risen -AxoMessengers._messenger1.Fallen -AxoMessengers._messenger1.Acknowledged -AxoMessengers._messenger2.Risen -AxoMessengers._messenger2.Fallen -AxoMessengers._messenger2.Acknowledged - \ No newline at end of file +#I_am_alive +#AxoMessengers._messenger1.Risen +#AxoMessengers._messenger1.Fallen +#AxoMessengers._messenger1.Acknowledged +#AxoMessengers._messenger2.Risen +#AxoMessengers._messenger2.Fallen +#AxoMessengers._messenger2.Acknowledged +AxoCognexVisionDatamanExampleContext.MyDataman._AcquisitionStatus +AxoCognexVisionDatamanExampleContext.MyDataman._ResultsStatus +AxoCognexVisionDatamanExampleContext.MyDataman._SoftEventStatus +AxoCognexVisionDatamanExampleContext.MyDataman._AcquisitionControl +AxoCognexVisionDatamanExampleContext.MyDataman._ResultsControl +AxoCognexVisionDatamanExampleContext.MyDataman._SoftEventControl diff --git a/src/integrations/ctrl/raw_hw.mon b/src/integrations/ctrl/raw_hw.mon new file mode 100644 index 000000000..91e6ddf68 --- /dev/null +++ b/src/integrations/ctrl/raw_hw.mon @@ -0,0 +1,8 @@ +HwInputs._10a1_Acquisition_Status_1 +HwInputs._10a1_Results_Status_1 +HwInputs._10a1_Soft_Event_Control_1 +#HwInputs._10a1_Result_Data_128_bytes_1 +HwOutputs._10a1_Acquisition_Control_1 +HwOutputs._10a1_Results_Control_1 +HwOutputs._10a1_Soft_Event_Control_1 +#HwOutputs._10a1_User_Data_128_bytes_1 \ No newline at end of file diff --git a/src/integrations/ctrl/raw_plc.mon b/src/integrations/ctrl/raw_plc.mon new file mode 100644 index 000000000..3d17ad74f --- /dev/null +++ b/src/integrations/ctrl/raw_plc.mon @@ -0,0 +1,13 @@ +#I_am_alive +#AxoMessengers._messenger1.Risen +#AxoMessengers._messenger1.Fallen +#AxoMessengers._messenger1.Acknowledged +#AxoMessengers._messenger2.Risen +#AxoMessengers._messenger2.Fallen +#AxoMessengers._messenger2.Acknowledged +PlcInputs._10a1_Acquisition_Status_1 +PlcInputs._10a1_Results_Status_1 +PlcInputs._10a1_Soft_Event_Control_1 +PlcOutputs._10a1_Acquisition_Control_1 +PlcOutputs._10a1_Results_Control_1 +PlcOutputs._10a1_Soft_Event_Control_1 diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AX_Plc1516V3_CognexDataman.zap18 b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AX_Plc1516V3_CognexDataman.zap18 new file mode 100644 index 0000000000000000000000000000000000000000..f3dbc1ff98cc718b451c4e923764f570baca9480 GIT binary patch literal 474394 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

GgK^LAfr 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
=F5sP(<;hYV8qm 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
  • r$}W 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 J2Ob50{{dCpE{^~J literal 0 HcmV?d00001 diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index b94f08d54..28a9dd4c2 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -9,8 +9,8 @@ NAMESPACE AxoCognexVisionDatamanExamples MyDataman : AXOpen.Cognex.Vision.v_6_0_0_0.AxoDataman; {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; + PlcInputs : REF_TO PlcInputs; + PlcOutputs : REF_TO PlcOutputs; END_VAR METHOD PROTECTED OVERRIDE Main @@ -20,14 +20,14 @@ NAMESPACE AxoCognexVisionDatamanExamples END_IF; // Calling the main method `Run` with respective input and output variables. MyDataman.Run( parent := THIS, - AcquisitionStatus := PlcInputs._10a1_Acquisition_Status_1, - ResultsStatus := PlcInputs._10a1_Results_Status_1, - SoftEventStatus := PlcInputs._10a1_Soft_Event_Control_1, - ResultData := PlcInputs._10a1_Result_Data_128_bytes_1, - AcquisitionControl := PlcOutputs._10a1_Acquisition_Control_1, - ResultsControl := PlcOutputs._10a1_Results_Control_1, - SoftEventControl := PlcOutputs._10a1_Soft_Event_Control_1, - UserData := PlcOutputs._10a1_User_Data_128_bytes_1); + AcquisitionStatus := PlcInputs^._10a1_Acquisition_Status_1, + ResultsStatus := PlcInputs^._10a1_Results_Status_1, + SoftEventStatus := PlcInputs^._10a1_Soft_Event_Control_1, + ResultData := PlcInputs^._10a1_Result_Data_128_bytes_1, + AcquisitionControl := PlcOutputs^._10a1_Acquisition_Control_1, + ResultsControl := PlcOutputs^._10a1_Results_Control_1, + SoftEventControl := PlcOutputs^._10a1_Soft_Event_Control_1, + UserData := PlcOutputs^._10a1_User_Data_128_bytes_1); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st index a1690b2c6..4976a7f6e 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st @@ -3,82 +3,6 @@ FUNCTION CopyInputs HwInputs : HwInputs; PlcInputs : PlcInputs; END_VAR - PlcInputs._11a1_DI_8x24VDC_ST_1 := HwInputs._11a1_DI_8x24VDC_ST_1; - PlcInputs._11a1_DI_8x24VDC_ST_2 := HwInputs._11a1_DI_8x24VDC_ST_2; - PlcInputs._12a1_Acquisition_Status_1[0] := HwInputs._12a1_Acquisition_Status_1[0]; - PlcInputs._12a1_Acquisition_Status_1[1] := HwInputs._12a1_Acquisition_Status_1[1]; - PlcInputs._12a1_Acquisition_Status_1[2] := HwInputs._12a1_Acquisition_Status_1[2]; - PlcInputs._12a1_Inspection_Status_1 := HwInputs._12a1_Inspection_Status_1; - PlcInputs._12a1_Command_Control_1 := HwInputs._12a1_Command_Control_1; - PlcInputs._12a1_SoftEvent_Control_1 := HwInputs._12a1_SoftEvent_Control_1; - PlcInputs._12a1_Results_64_bytes_1[0] := HwInputs._12a1_Results_64_bytes_1[0]; - PlcInputs._12a1_Results_64_bytes_1[1] := HwInputs._12a1_Results_64_bytes_1[1]; - PlcInputs._12a1_Results_64_bytes_1[2] := HwInputs._12a1_Results_64_bytes_1[2]; - PlcInputs._12a1_Results_64_bytes_1[3] := HwInputs._12a1_Results_64_bytes_1[3]; - PlcInputs._12a1_Results_64_bytes_1[4] := HwInputs._12a1_Results_64_bytes_1[4]; - PlcInputs._12a1_Results_64_bytes_1[5] := HwInputs._12a1_Results_64_bytes_1[5]; - PlcInputs._12a1_Results_64_bytes_1[6] := HwInputs._12a1_Results_64_bytes_1[6]; - PlcInputs._12a1_Results_64_bytes_1[7] := HwInputs._12a1_Results_64_bytes_1[7]; - PlcInputs._12a1_Results_64_bytes_1[8] := HwInputs._12a1_Results_64_bytes_1[8]; - PlcInputs._12a1_Results_64_bytes_1[9] := HwInputs._12a1_Results_64_bytes_1[9]; - PlcInputs._12a1_Results_64_bytes_1[10] := HwInputs._12a1_Results_64_bytes_1[10]; - PlcInputs._12a1_Results_64_bytes_1[11] := HwInputs._12a1_Results_64_bytes_1[11]; - PlcInputs._12a1_Results_64_bytes_1[12] := HwInputs._12a1_Results_64_bytes_1[12]; - PlcInputs._12a1_Results_64_bytes_1[13] := HwInputs._12a1_Results_64_bytes_1[13]; - PlcInputs._12a1_Results_64_bytes_1[14] := HwInputs._12a1_Results_64_bytes_1[14]; - PlcInputs._12a1_Results_64_bytes_1[15] := HwInputs._12a1_Results_64_bytes_1[15]; - PlcInputs._12a1_Results_64_bytes_1[16] := HwInputs._12a1_Results_64_bytes_1[16]; - PlcInputs._12a1_Results_64_bytes_1[17] := HwInputs._12a1_Results_64_bytes_1[17]; - PlcInputs._12a1_Results_64_bytes_1[18] := HwInputs._12a1_Results_64_bytes_1[18]; - PlcInputs._12a1_Results_64_bytes_1[19] := HwInputs._12a1_Results_64_bytes_1[19]; - PlcInputs._12a1_Results_64_bytes_1[20] := HwInputs._12a1_Results_64_bytes_1[20]; - PlcInputs._12a1_Results_64_bytes_1[21] := HwInputs._12a1_Results_64_bytes_1[21]; - PlcInputs._12a1_Results_64_bytes_1[22] := HwInputs._12a1_Results_64_bytes_1[22]; - PlcInputs._12a1_Results_64_bytes_1[23] := HwInputs._12a1_Results_64_bytes_1[23]; - PlcInputs._12a1_Results_64_bytes_1[24] := HwInputs._12a1_Results_64_bytes_1[24]; - PlcInputs._12a1_Results_64_bytes_1[25] := HwInputs._12a1_Results_64_bytes_1[25]; - PlcInputs._12a1_Results_64_bytes_1[26] := HwInputs._12a1_Results_64_bytes_1[26]; - PlcInputs._12a1_Results_64_bytes_1[27] := HwInputs._12a1_Results_64_bytes_1[27]; - PlcInputs._12a1_Results_64_bytes_1[28] := HwInputs._12a1_Results_64_bytes_1[28]; - PlcInputs._12a1_Results_64_bytes_1[29] := HwInputs._12a1_Results_64_bytes_1[29]; - PlcInputs._12a1_Results_64_bytes_1[30] := HwInputs._12a1_Results_64_bytes_1[30]; - PlcInputs._12a1_Results_64_bytes_1[31] := HwInputs._12a1_Results_64_bytes_1[31]; - PlcInputs._12a1_Results_64_bytes_1[32] := HwInputs._12a1_Results_64_bytes_1[32]; - PlcInputs._12a1_Results_64_bytes_1[33] := HwInputs._12a1_Results_64_bytes_1[33]; - PlcInputs._12a1_Results_64_bytes_1[34] := HwInputs._12a1_Results_64_bytes_1[34]; - PlcInputs._12a1_Results_64_bytes_1[35] := HwInputs._12a1_Results_64_bytes_1[35]; - PlcInputs._12a1_Results_64_bytes_1[36] := HwInputs._12a1_Results_64_bytes_1[36]; - PlcInputs._12a1_Results_64_bytes_1[37] := HwInputs._12a1_Results_64_bytes_1[37]; - PlcInputs._12a1_Results_64_bytes_1[38] := HwInputs._12a1_Results_64_bytes_1[38]; - PlcInputs._12a1_Results_64_bytes_1[39] := HwInputs._12a1_Results_64_bytes_1[39]; - PlcInputs._12a1_Results_64_bytes_1[40] := HwInputs._12a1_Results_64_bytes_1[40]; - PlcInputs._12a1_Results_64_bytes_1[41] := HwInputs._12a1_Results_64_bytes_1[41]; - PlcInputs._12a1_Results_64_bytes_1[42] := HwInputs._12a1_Results_64_bytes_1[42]; - PlcInputs._12a1_Results_64_bytes_1[43] := HwInputs._12a1_Results_64_bytes_1[43]; - PlcInputs._12a1_Results_64_bytes_1[44] := HwInputs._12a1_Results_64_bytes_1[44]; - PlcInputs._12a1_Results_64_bytes_1[45] := HwInputs._12a1_Results_64_bytes_1[45]; - PlcInputs._12a1_Results_64_bytes_1[46] := HwInputs._12a1_Results_64_bytes_1[46]; - PlcInputs._12a1_Results_64_bytes_1[47] := HwInputs._12a1_Results_64_bytes_1[47]; - PlcInputs._12a1_Results_64_bytes_1[48] := HwInputs._12a1_Results_64_bytes_1[48]; - PlcInputs._12a1_Results_64_bytes_1[49] := HwInputs._12a1_Results_64_bytes_1[49]; - PlcInputs._12a1_Results_64_bytes_1[50] := HwInputs._12a1_Results_64_bytes_1[50]; - PlcInputs._12a1_Results_64_bytes_1[51] := HwInputs._12a1_Results_64_bytes_1[51]; - PlcInputs._12a1_Results_64_bytes_1[52] := HwInputs._12a1_Results_64_bytes_1[52]; - PlcInputs._12a1_Results_64_bytes_1[53] := HwInputs._12a1_Results_64_bytes_1[53]; - PlcInputs._12a1_Results_64_bytes_1[54] := HwInputs._12a1_Results_64_bytes_1[54]; - PlcInputs._12a1_Results_64_bytes_1[55] := HwInputs._12a1_Results_64_bytes_1[55]; - PlcInputs._12a1_Results_64_bytes_1[56] := HwInputs._12a1_Results_64_bytes_1[56]; - PlcInputs._12a1_Results_64_bytes_1[57] := HwInputs._12a1_Results_64_bytes_1[57]; - PlcInputs._12a1_Results_64_bytes_1[58] := HwInputs._12a1_Results_64_bytes_1[58]; - PlcInputs._12a1_Results_64_bytes_1[59] := HwInputs._12a1_Results_64_bytes_1[59]; - PlcInputs._12a1_Results_64_bytes_1[60] := HwInputs._12a1_Results_64_bytes_1[60]; - PlcInputs._12a1_Results_64_bytes_1[61] := HwInputs._12a1_Results_64_bytes_1[61]; - PlcInputs._12a1_Results_64_bytes_1[62] := HwInputs._12a1_Results_64_bytes_1[62]; - PlcInputs._12a1_Results_64_bytes_1[63] := HwInputs._12a1_Results_64_bytes_1[63]; - PlcInputs._12a1_Results_64_bytes_1[64] := HwInputs._12a1_Results_64_bytes_1[64]; - PlcInputs._12a1_Results_64_bytes_1[65] := HwInputs._12a1_Results_64_bytes_1[65]; - PlcInputs._12a1_Results_64_bytes_1[66] := HwInputs._12a1_Results_64_bytes_1[66]; - PlcInputs._12a1_Results_64_bytes_1[67] := HwInputs._12a1_Results_64_bytes_1[67]; PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st index caf897994..8d2e266c0 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st @@ -3,75 +3,6 @@ FUNCTION CopyOutputs HwOutputs : HwOutputs; PlcOutputs : PlcOutputs; END_VAR - HwOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1; - HwOutputs._12a1_Acquisition_Control_1 := PlcOutputs._12a1_Acquisition_Control_1; - HwOutputs._12a1_Inspection_Control_1 := PlcOutputs._12a1_Inspection_Control_1; - HwOutputs._12a1_Command_Control_1 := PlcOutputs._12a1_Command_Control_1; - HwOutputs._12a1_SoftEvent_Control_1 := PlcOutputs._12a1_SoftEvent_Control_1; - HwOutputs._12a1_User_Data_64_bytes_1[0] := PlcOutputs._12a1_User_Data_64_bytes_1[0]; - HwOutputs._12a1_User_Data_64_bytes_1[1] := PlcOutputs._12a1_User_Data_64_bytes_1[1]; - HwOutputs._12a1_User_Data_64_bytes_1[2] := PlcOutputs._12a1_User_Data_64_bytes_1[2]; - HwOutputs._12a1_User_Data_64_bytes_1[3] := PlcOutputs._12a1_User_Data_64_bytes_1[3]; - HwOutputs._12a1_User_Data_64_bytes_1[4] := PlcOutputs._12a1_User_Data_64_bytes_1[4]; - HwOutputs._12a1_User_Data_64_bytes_1[5] := PlcOutputs._12a1_User_Data_64_bytes_1[5]; - HwOutputs._12a1_User_Data_64_bytes_1[6] := PlcOutputs._12a1_User_Data_64_bytes_1[6]; - HwOutputs._12a1_User_Data_64_bytes_1[7] := PlcOutputs._12a1_User_Data_64_bytes_1[7]; - HwOutputs._12a1_User_Data_64_bytes_1[8] := PlcOutputs._12a1_User_Data_64_bytes_1[8]; - HwOutputs._12a1_User_Data_64_bytes_1[9] := PlcOutputs._12a1_User_Data_64_bytes_1[9]; - HwOutputs._12a1_User_Data_64_bytes_1[10] := PlcOutputs._12a1_User_Data_64_bytes_1[10]; - HwOutputs._12a1_User_Data_64_bytes_1[11] := PlcOutputs._12a1_User_Data_64_bytes_1[11]; - HwOutputs._12a1_User_Data_64_bytes_1[12] := PlcOutputs._12a1_User_Data_64_bytes_1[12]; - HwOutputs._12a1_User_Data_64_bytes_1[13] := PlcOutputs._12a1_User_Data_64_bytes_1[13]; - HwOutputs._12a1_User_Data_64_bytes_1[14] := PlcOutputs._12a1_User_Data_64_bytes_1[14]; - HwOutputs._12a1_User_Data_64_bytes_1[15] := PlcOutputs._12a1_User_Data_64_bytes_1[15]; - HwOutputs._12a1_User_Data_64_bytes_1[16] := PlcOutputs._12a1_User_Data_64_bytes_1[16]; - HwOutputs._12a1_User_Data_64_bytes_1[17] := PlcOutputs._12a1_User_Data_64_bytes_1[17]; - HwOutputs._12a1_User_Data_64_bytes_1[18] := PlcOutputs._12a1_User_Data_64_bytes_1[18]; - HwOutputs._12a1_User_Data_64_bytes_1[19] := PlcOutputs._12a1_User_Data_64_bytes_1[19]; - HwOutputs._12a1_User_Data_64_bytes_1[20] := PlcOutputs._12a1_User_Data_64_bytes_1[20]; - HwOutputs._12a1_User_Data_64_bytes_1[21] := PlcOutputs._12a1_User_Data_64_bytes_1[21]; - HwOutputs._12a1_User_Data_64_bytes_1[22] := PlcOutputs._12a1_User_Data_64_bytes_1[22]; - HwOutputs._12a1_User_Data_64_bytes_1[23] := PlcOutputs._12a1_User_Data_64_bytes_1[23]; - HwOutputs._12a1_User_Data_64_bytes_1[24] := PlcOutputs._12a1_User_Data_64_bytes_1[24]; - HwOutputs._12a1_User_Data_64_bytes_1[25] := PlcOutputs._12a1_User_Data_64_bytes_1[25]; - HwOutputs._12a1_User_Data_64_bytes_1[26] := PlcOutputs._12a1_User_Data_64_bytes_1[26]; - HwOutputs._12a1_User_Data_64_bytes_1[27] := PlcOutputs._12a1_User_Data_64_bytes_1[27]; - HwOutputs._12a1_User_Data_64_bytes_1[28] := PlcOutputs._12a1_User_Data_64_bytes_1[28]; - HwOutputs._12a1_User_Data_64_bytes_1[29] := PlcOutputs._12a1_User_Data_64_bytes_1[29]; - HwOutputs._12a1_User_Data_64_bytes_1[30] := PlcOutputs._12a1_User_Data_64_bytes_1[30]; - HwOutputs._12a1_User_Data_64_bytes_1[31] := PlcOutputs._12a1_User_Data_64_bytes_1[31]; - HwOutputs._12a1_User_Data_64_bytes_1[32] := PlcOutputs._12a1_User_Data_64_bytes_1[32]; - HwOutputs._12a1_User_Data_64_bytes_1[33] := PlcOutputs._12a1_User_Data_64_bytes_1[33]; - HwOutputs._12a1_User_Data_64_bytes_1[34] := PlcOutputs._12a1_User_Data_64_bytes_1[34]; - HwOutputs._12a1_User_Data_64_bytes_1[35] := PlcOutputs._12a1_User_Data_64_bytes_1[35]; - HwOutputs._12a1_User_Data_64_bytes_1[36] := PlcOutputs._12a1_User_Data_64_bytes_1[36]; - HwOutputs._12a1_User_Data_64_bytes_1[37] := PlcOutputs._12a1_User_Data_64_bytes_1[37]; - HwOutputs._12a1_User_Data_64_bytes_1[38] := PlcOutputs._12a1_User_Data_64_bytes_1[38]; - HwOutputs._12a1_User_Data_64_bytes_1[39] := PlcOutputs._12a1_User_Data_64_bytes_1[39]; - HwOutputs._12a1_User_Data_64_bytes_1[40] := PlcOutputs._12a1_User_Data_64_bytes_1[40]; - HwOutputs._12a1_User_Data_64_bytes_1[41] := PlcOutputs._12a1_User_Data_64_bytes_1[41]; - HwOutputs._12a1_User_Data_64_bytes_1[42] := PlcOutputs._12a1_User_Data_64_bytes_1[42]; - HwOutputs._12a1_User_Data_64_bytes_1[43] := PlcOutputs._12a1_User_Data_64_bytes_1[43]; - HwOutputs._12a1_User_Data_64_bytes_1[44] := PlcOutputs._12a1_User_Data_64_bytes_1[44]; - HwOutputs._12a1_User_Data_64_bytes_1[45] := PlcOutputs._12a1_User_Data_64_bytes_1[45]; - HwOutputs._12a1_User_Data_64_bytes_1[46] := PlcOutputs._12a1_User_Data_64_bytes_1[46]; - HwOutputs._12a1_User_Data_64_bytes_1[47] := PlcOutputs._12a1_User_Data_64_bytes_1[47]; - HwOutputs._12a1_User_Data_64_bytes_1[48] := PlcOutputs._12a1_User_Data_64_bytes_1[48]; - HwOutputs._12a1_User_Data_64_bytes_1[49] := PlcOutputs._12a1_User_Data_64_bytes_1[49]; - HwOutputs._12a1_User_Data_64_bytes_1[50] := PlcOutputs._12a1_User_Data_64_bytes_1[50]; - HwOutputs._12a1_User_Data_64_bytes_1[51] := PlcOutputs._12a1_User_Data_64_bytes_1[51]; - HwOutputs._12a1_User_Data_64_bytes_1[52] := PlcOutputs._12a1_User_Data_64_bytes_1[52]; - HwOutputs._12a1_User_Data_64_bytes_1[53] := PlcOutputs._12a1_User_Data_64_bytes_1[53]; - HwOutputs._12a1_User_Data_64_bytes_1[54] := PlcOutputs._12a1_User_Data_64_bytes_1[54]; - HwOutputs._12a1_User_Data_64_bytes_1[55] := PlcOutputs._12a1_User_Data_64_bytes_1[55]; - HwOutputs._12a1_User_Data_64_bytes_1[56] := PlcOutputs._12a1_User_Data_64_bytes_1[56]; - HwOutputs._12a1_User_Data_64_bytes_1[57] := PlcOutputs._12a1_User_Data_64_bytes_1[57]; - HwOutputs._12a1_User_Data_64_bytes_1[58] := PlcOutputs._12a1_User_Data_64_bytes_1[58]; - HwOutputs._12a1_User_Data_64_bytes_1[59] := PlcOutputs._12a1_User_Data_64_bytes_1[59]; - HwOutputs._12a1_User_Data_64_bytes_1[60] := PlcOutputs._12a1_User_Data_64_bytes_1[60]; - HwOutputs._12a1_User_Data_64_bytes_1[61] := PlcOutputs._12a1_User_Data_64_bytes_1[61]; - HwOutputs._12a1_User_Data_64_bytes_1[62] := PlcOutputs._12a1_User_Data_64_bytes_1[62]; - HwOutputs._12a1_User_Data_64_bytes_1[63] := PlcOutputs._12a1_User_Data_64_bytes_1[63]; HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st index 9dfa1760b..b7df6729a 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st @@ -1,15 +1,8 @@ TYPE HwInputs : STRUCT - _11a1_DI_8x24VDC_ST_1 AT %B0 : BYTE; - _11a1_DI_8x24VDC_ST_2 AT %B1 : BYTE; - _12a1_Acquisition_Status_1 AT %B2 : ARRAY[0..2] OF BYTE; - _12a1_Inspection_Status_1 AT %B5 : DWORD; - _12a1_Command_Control_1 AT %B9 : WORD; - _12a1_SoftEvent_Control_1 AT %B11 : BYTE; - _12a1_Results_64_bytes_1 AT %B12 : ARRAY[0..67] OF BYTE; - _10a1_Acquisition_Status_1 AT %B80 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 AT %B83 : BYTE; - _10a1_Soft_Event_Control_1 AT %B84 : BYTE; - _10a1_Result_Data_128_bytes_1 AT %B85 : ARRAY[0..135] OF BYTE; + _10a1_Acquisition_Status_1 AT %B82 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 AT %B85 : BYTE; + _10a1_Soft_Event_Control_1 AT %B86 : BYTE; + _10a1_Result_Data_128_bytes_1 AT %B87 : ARRAY[0..135] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st index 97d565aed..6c930f523 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st @@ -1,14 +1,8 @@ TYPE HwOutputs : STRUCT - _11a1_DQ_8x24VDC_0_5A_ST_1 AT %B0 : BYTE; - _12a1_Acquisition_Control_1 AT %B1 : BYTE; - _12a1_Inspection_Control_1 AT %B2 : BYTE; - _12a1_Command_Control_1 AT %B3 : WORD; - _12a1_SoftEvent_Control_1 AT %B5 : BYTE; - _12a1_User_Data_64_bytes_1 AT %B6 : ARRAY[0..63] OF BYTE; - _10a1_Acquisition_Control_1 AT %B70 : BYTE; - _10a1_Results_Control_1 AT %B71 : BYTE; - _10a1_Soft_Event_Control_1 AT %B72 : BYTE; - _10a1_User_Data_128_bytes_1 AT %B73 : ARRAY[0..131] OF BYTE; + _10a1_Acquisition_Control_1 AT %B72 : BYTE; + _10a1_Results_Control_1 AT %B73 : BYTE; + _10a1_Soft_Event_Control_1 AT %B74 : BYTE; + _10a1_User_Data_128_bytes_1 AT %B75 : ARRAY[0..131] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st index 7fe1d3a2a..97b3efc59 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st @@ -1,15 +1,8 @@ TYPE PlcInputs : STRUCT - _11a1_DI_8x24VDC_ST_1 : BYTE; - _11a1_DI_8x24VDC_ST_2 : BYTE; - _12a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _12a1_Inspection_Status_1 : DWORD; - _12a1_Command_Control_1 : WORD; - _12a1_SoftEvent_Control_1 : BYTE; - _12a1_Results_64_bytes_1 : ARRAY[0..67] OF BYTE; - _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st index 2ea4d4ab4..6389c2461 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st @@ -1,14 +1,8 @@ TYPE PlcOutputs : STRUCT - _11a1_DQ_8x24VDC_0_5A_ST_1 : BYTE; - _12a1_Acquisition_Control_1 : BYTE; - _12a1_Inspection_Control_1 : BYTE; - _12a1_Command_Control_1 : WORD; - _12a1_SoftEvent_Control_1 : BYTE; - _12a1_User_Data_64_bytes_1 : ARRAY[0..63] OF BYTE; - _10a1_Acquisition_Control_1 : BYTE; - _10a1_Results_Control_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + _10a1_Acquisition_Control_1 : BYTE; + _10a1_Results_Control_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/program.st b/src/integrations/ctrl/src/program.st index 1d393c140..31b454dc8 100644 --- a/src/integrations/ctrl/src/program.st +++ b/src/integrations/ctrl/src/program.st @@ -63,8 +63,8 @@ PROGRAM MyProgram AxoMessengersDocu.InjectRtc(AxoRtc); AxoDataFragmentExchangeContext.Run(); - AxoCognexVisionDatamanExampleContext.PlcInputs := PlcInputs; - AxoCognexVisionDatamanExampleContext.PlcOutputs := PlcOutputs; + AxoCognexVisionDatamanExampleContext.PlcInputs := REF(PlcInputs); + AxoCognexVisionDatamanExampleContext.PlcOutputs := REF(PlcOutputs); AxoCognexVisionDatamanExampleContext.Run(); AxoLoggers.InjectRtc(AxoRtc); @@ -117,20 +117,3 @@ CLASS MyContext EXTENDS AxoContext END_METHOD END_CLASS - - - - // Context.Inputs := REF(Inputs); - // Context.Outputs := REF(Outputs); - // Context.PlcInputs := REF(PlcInputs); - // Context.PlcOutputs := REF(PlcOutputs); - - - // ContextLogger.SetMinimumLevel(AXOpen.Logging.eLogLevel#Verbose); - // Context.InjectRtc(S71500Rtc); - // Context.InjectLogger(ContextLogger); - // // Executes the main context of this application. - // Context.Run(); - - -// END_PROGRAM From 11ef3b7661302ddba286c9d08109a00600ed8262 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Thu, 27 Jul 2023 16:16:07 +0200 Subject: [PATCH 06/32] wip --- src/templates.simple/ctrl/Reader_hw.mon | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/templates.simple/ctrl/Reader_hw.mon diff --git a/src/templates.simple/ctrl/Reader_hw.mon b/src/templates.simple/ctrl/Reader_hw.mon new file mode 100644 index 000000000..c6cfe77e2 --- /dev/null +++ b/src/templates.simple/ctrl/Reader_hw.mon @@ -0,0 +1,2 @@ + +PlcOutputs._10a1_Acquisition_Control_1 From 7c5e3a55a42e390b2a66f1b5e8bf7059ae5b6cf2 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Thu, 27 Jul 2023 21:46:27 +0200 Subject: [PATCH 07/32] reader working inside the templates simple --- src/templates.simple/ctrl/Reader.mon | 8 +- src/templates.simple/ctrl/Reader_hw.mon | 10 ++- src/templates.simple/ctrl/Reader_plc.mon | 8 ++ .../ctrl/src/Examples/PneumaticManipulator.st | 4 +- .../ctrl/src/IO/CopyInputs.st | 76 ------------------- .../ctrl/src/IO/CopyOutputs.st | 69 ----------------- src/templates.simple/ctrl/src/IO/HwInputs.st | 15 +--- src/templates.simple/ctrl/src/IO/HwOutputs.st | 14 +--- src/templates.simple/ctrl/src/IO/PlcInputs.st | 15 +--- .../ctrl/src/IO/PlcOutputs.st | 14 +--- 10 files changed, 39 insertions(+), 194 deletions(-) create mode 100644 src/templates.simple/ctrl/Reader_plc.mon diff --git a/src/templates.simple/ctrl/Reader.mon b/src/templates.simple/ctrl/Reader.mon index 237603113..a5b222674 100644 --- a/src/templates.simple/ctrl/Reader.mon +++ b/src/templates.simple/ctrl/Reader.mon @@ -1,5 +1,7 @@ Context.PneumaticManipulator.Components.Citacka._AcquisitionControl -PlcOutputs._10a1_Acquisition_Control_1 -#Context.PneumaticManipulator.Components.Citacka.ReadedData -#Context.PneumaticManipulator.Components.Citacka._Results_128_DataString \ No newline at end of file +Context.PneumaticManipulator.Components.Citacka._AcquisitionStatus +Context.PneumaticManipulator.Components.Citacka._ResultsControl +Context.PneumaticManipulator.Components.Citacka._ResultsStatus +Context.PneumaticManipulator.Components.Citacka._SoftEventControl +Context.PneumaticManipulator.Components.Citacka._SoftEventStatus diff --git a/src/templates.simple/ctrl/Reader_hw.mon b/src/templates.simple/ctrl/Reader_hw.mon index c6cfe77e2..4bc26d878 100644 --- a/src/templates.simple/ctrl/Reader_hw.mon +++ b/src/templates.simple/ctrl/Reader_hw.mon @@ -1,2 +1,8 @@ - -PlcOutputs._10a1_Acquisition_Control_1 +HwInputs._10a1_Acquisition_Status_1 +HwInputs._10a1_Results_Status_1 +HwInputs._10a1_Soft_Event_Control_1 +#HwInputs._10a1_Result_Data_128_bytes_1 +HwOutputs._10a1_Acquisition_Control_1 +HwOutputs._10a1_Results_Control_1 +HwOutputs._10a1_Soft_Event_Control_1 +#HwOutputs._10a1_User_Data_128_bytes_1 diff --git a/src/templates.simple/ctrl/Reader_plc.mon b/src/templates.simple/ctrl/Reader_plc.mon new file mode 100644 index 000000000..184630fd7 --- /dev/null +++ b/src/templates.simple/ctrl/Reader_plc.mon @@ -0,0 +1,8 @@ +PlcInputs._10a1_Acquisition_Status_1 +PlcInputs._10a1_Results_Status_1 +PlcInputs._10a1_Soft_Event_Control_1 +#PlcInputs._10a1_Result_Data_128_bytes_1 +PlcOutputs._10a1_Acquisition_Control_1 +PlcOutputs._10a1_Results_Control_1 +PlcOutputs._10a1_Soft_Event_Control_1 +#PlcOutputs._10a1_User_Data_128_bytes_1 diff --git a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st index b8076a339..ab5bfdd34 100644 --- a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st +++ b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st @@ -31,8 +31,8 @@ NAMESPACE examples.PneumaticManipulator THIS.Initialize(parent); // HERE INITIALIZE YOUR COMPONENTS HorizontalCylinder.Update(THIS, Inputs.B0[0], Inputs.B0[1], Outputs.B0[0], Outputs.B0[1]); - VerticalCylinder.Update(THIS, Inputs.B0[2], Inputs.B0[3], PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X2, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X3); - GripperCylinder.Update(THIS, PlcInputs._11a1_DI_8x24VDC_ST_2.%X6, PlcInputs._11a1_DI_8x24VDC_ST_2.%X7, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X6, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X7); + // VerticalCylinder.Update(THIS, Inputs.B0[2], Inputs.B0[3], PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X2, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X3); + // GripperCylinder.Update(THIS, PlcInputs._11a1_DI_8x24VDC_ST_2.%X6, PlcInputs._11a1_DI_8x24VDC_ST_2.%X7, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X6, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X7); Citacka.Update(THIS, PlcInputs._10a1_Acquisition_Status_1, PlcInputs._10a1_Results_Status_1, PlcInputs._10a1_Soft_Event_Control_1, diff --git a/src/templates.simple/ctrl/src/IO/CopyInputs.st b/src/templates.simple/ctrl/src/IO/CopyInputs.st index a1690b2c6..4976a7f6e 100644 --- a/src/templates.simple/ctrl/src/IO/CopyInputs.st +++ b/src/templates.simple/ctrl/src/IO/CopyInputs.st @@ -3,82 +3,6 @@ FUNCTION CopyInputs HwInputs : HwInputs; PlcInputs : PlcInputs; END_VAR - PlcInputs._11a1_DI_8x24VDC_ST_1 := HwInputs._11a1_DI_8x24VDC_ST_1; - PlcInputs._11a1_DI_8x24VDC_ST_2 := HwInputs._11a1_DI_8x24VDC_ST_2; - PlcInputs._12a1_Acquisition_Status_1[0] := HwInputs._12a1_Acquisition_Status_1[0]; - PlcInputs._12a1_Acquisition_Status_1[1] := HwInputs._12a1_Acquisition_Status_1[1]; - PlcInputs._12a1_Acquisition_Status_1[2] := HwInputs._12a1_Acquisition_Status_1[2]; - PlcInputs._12a1_Inspection_Status_1 := HwInputs._12a1_Inspection_Status_1; - PlcInputs._12a1_Command_Control_1 := HwInputs._12a1_Command_Control_1; - PlcInputs._12a1_SoftEvent_Control_1 := HwInputs._12a1_SoftEvent_Control_1; - PlcInputs._12a1_Results_64_bytes_1[0] := HwInputs._12a1_Results_64_bytes_1[0]; - PlcInputs._12a1_Results_64_bytes_1[1] := HwInputs._12a1_Results_64_bytes_1[1]; - PlcInputs._12a1_Results_64_bytes_1[2] := HwInputs._12a1_Results_64_bytes_1[2]; - PlcInputs._12a1_Results_64_bytes_1[3] := HwInputs._12a1_Results_64_bytes_1[3]; - PlcInputs._12a1_Results_64_bytes_1[4] := HwInputs._12a1_Results_64_bytes_1[4]; - PlcInputs._12a1_Results_64_bytes_1[5] := HwInputs._12a1_Results_64_bytes_1[5]; - PlcInputs._12a1_Results_64_bytes_1[6] := HwInputs._12a1_Results_64_bytes_1[6]; - PlcInputs._12a1_Results_64_bytes_1[7] := HwInputs._12a1_Results_64_bytes_1[7]; - PlcInputs._12a1_Results_64_bytes_1[8] := HwInputs._12a1_Results_64_bytes_1[8]; - PlcInputs._12a1_Results_64_bytes_1[9] := HwInputs._12a1_Results_64_bytes_1[9]; - PlcInputs._12a1_Results_64_bytes_1[10] := HwInputs._12a1_Results_64_bytes_1[10]; - PlcInputs._12a1_Results_64_bytes_1[11] := HwInputs._12a1_Results_64_bytes_1[11]; - PlcInputs._12a1_Results_64_bytes_1[12] := HwInputs._12a1_Results_64_bytes_1[12]; - PlcInputs._12a1_Results_64_bytes_1[13] := HwInputs._12a1_Results_64_bytes_1[13]; - PlcInputs._12a1_Results_64_bytes_1[14] := HwInputs._12a1_Results_64_bytes_1[14]; - PlcInputs._12a1_Results_64_bytes_1[15] := HwInputs._12a1_Results_64_bytes_1[15]; - PlcInputs._12a1_Results_64_bytes_1[16] := HwInputs._12a1_Results_64_bytes_1[16]; - PlcInputs._12a1_Results_64_bytes_1[17] := HwInputs._12a1_Results_64_bytes_1[17]; - PlcInputs._12a1_Results_64_bytes_1[18] := HwInputs._12a1_Results_64_bytes_1[18]; - PlcInputs._12a1_Results_64_bytes_1[19] := HwInputs._12a1_Results_64_bytes_1[19]; - PlcInputs._12a1_Results_64_bytes_1[20] := HwInputs._12a1_Results_64_bytes_1[20]; - PlcInputs._12a1_Results_64_bytes_1[21] := HwInputs._12a1_Results_64_bytes_1[21]; - PlcInputs._12a1_Results_64_bytes_1[22] := HwInputs._12a1_Results_64_bytes_1[22]; - PlcInputs._12a1_Results_64_bytes_1[23] := HwInputs._12a1_Results_64_bytes_1[23]; - PlcInputs._12a1_Results_64_bytes_1[24] := HwInputs._12a1_Results_64_bytes_1[24]; - PlcInputs._12a1_Results_64_bytes_1[25] := HwInputs._12a1_Results_64_bytes_1[25]; - PlcInputs._12a1_Results_64_bytes_1[26] := HwInputs._12a1_Results_64_bytes_1[26]; - PlcInputs._12a1_Results_64_bytes_1[27] := HwInputs._12a1_Results_64_bytes_1[27]; - PlcInputs._12a1_Results_64_bytes_1[28] := HwInputs._12a1_Results_64_bytes_1[28]; - PlcInputs._12a1_Results_64_bytes_1[29] := HwInputs._12a1_Results_64_bytes_1[29]; - PlcInputs._12a1_Results_64_bytes_1[30] := HwInputs._12a1_Results_64_bytes_1[30]; - PlcInputs._12a1_Results_64_bytes_1[31] := HwInputs._12a1_Results_64_bytes_1[31]; - PlcInputs._12a1_Results_64_bytes_1[32] := HwInputs._12a1_Results_64_bytes_1[32]; - PlcInputs._12a1_Results_64_bytes_1[33] := HwInputs._12a1_Results_64_bytes_1[33]; - PlcInputs._12a1_Results_64_bytes_1[34] := HwInputs._12a1_Results_64_bytes_1[34]; - PlcInputs._12a1_Results_64_bytes_1[35] := HwInputs._12a1_Results_64_bytes_1[35]; - PlcInputs._12a1_Results_64_bytes_1[36] := HwInputs._12a1_Results_64_bytes_1[36]; - PlcInputs._12a1_Results_64_bytes_1[37] := HwInputs._12a1_Results_64_bytes_1[37]; - PlcInputs._12a1_Results_64_bytes_1[38] := HwInputs._12a1_Results_64_bytes_1[38]; - PlcInputs._12a1_Results_64_bytes_1[39] := HwInputs._12a1_Results_64_bytes_1[39]; - PlcInputs._12a1_Results_64_bytes_1[40] := HwInputs._12a1_Results_64_bytes_1[40]; - PlcInputs._12a1_Results_64_bytes_1[41] := HwInputs._12a1_Results_64_bytes_1[41]; - PlcInputs._12a1_Results_64_bytes_1[42] := HwInputs._12a1_Results_64_bytes_1[42]; - PlcInputs._12a1_Results_64_bytes_1[43] := HwInputs._12a1_Results_64_bytes_1[43]; - PlcInputs._12a1_Results_64_bytes_1[44] := HwInputs._12a1_Results_64_bytes_1[44]; - PlcInputs._12a1_Results_64_bytes_1[45] := HwInputs._12a1_Results_64_bytes_1[45]; - PlcInputs._12a1_Results_64_bytes_1[46] := HwInputs._12a1_Results_64_bytes_1[46]; - PlcInputs._12a1_Results_64_bytes_1[47] := HwInputs._12a1_Results_64_bytes_1[47]; - PlcInputs._12a1_Results_64_bytes_1[48] := HwInputs._12a1_Results_64_bytes_1[48]; - PlcInputs._12a1_Results_64_bytes_1[49] := HwInputs._12a1_Results_64_bytes_1[49]; - PlcInputs._12a1_Results_64_bytes_1[50] := HwInputs._12a1_Results_64_bytes_1[50]; - PlcInputs._12a1_Results_64_bytes_1[51] := HwInputs._12a1_Results_64_bytes_1[51]; - PlcInputs._12a1_Results_64_bytes_1[52] := HwInputs._12a1_Results_64_bytes_1[52]; - PlcInputs._12a1_Results_64_bytes_1[53] := HwInputs._12a1_Results_64_bytes_1[53]; - PlcInputs._12a1_Results_64_bytes_1[54] := HwInputs._12a1_Results_64_bytes_1[54]; - PlcInputs._12a1_Results_64_bytes_1[55] := HwInputs._12a1_Results_64_bytes_1[55]; - PlcInputs._12a1_Results_64_bytes_1[56] := HwInputs._12a1_Results_64_bytes_1[56]; - PlcInputs._12a1_Results_64_bytes_1[57] := HwInputs._12a1_Results_64_bytes_1[57]; - PlcInputs._12a1_Results_64_bytes_1[58] := HwInputs._12a1_Results_64_bytes_1[58]; - PlcInputs._12a1_Results_64_bytes_1[59] := HwInputs._12a1_Results_64_bytes_1[59]; - PlcInputs._12a1_Results_64_bytes_1[60] := HwInputs._12a1_Results_64_bytes_1[60]; - PlcInputs._12a1_Results_64_bytes_1[61] := HwInputs._12a1_Results_64_bytes_1[61]; - PlcInputs._12a1_Results_64_bytes_1[62] := HwInputs._12a1_Results_64_bytes_1[62]; - PlcInputs._12a1_Results_64_bytes_1[63] := HwInputs._12a1_Results_64_bytes_1[63]; - PlcInputs._12a1_Results_64_bytes_1[64] := HwInputs._12a1_Results_64_bytes_1[64]; - PlcInputs._12a1_Results_64_bytes_1[65] := HwInputs._12a1_Results_64_bytes_1[65]; - PlcInputs._12a1_Results_64_bytes_1[66] := HwInputs._12a1_Results_64_bytes_1[66]; - PlcInputs._12a1_Results_64_bytes_1[67] := HwInputs._12a1_Results_64_bytes_1[67]; PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; diff --git a/src/templates.simple/ctrl/src/IO/CopyOutputs.st b/src/templates.simple/ctrl/src/IO/CopyOutputs.st index caf897994..8d2e266c0 100644 --- a/src/templates.simple/ctrl/src/IO/CopyOutputs.st +++ b/src/templates.simple/ctrl/src/IO/CopyOutputs.st @@ -3,75 +3,6 @@ FUNCTION CopyOutputs HwOutputs : HwOutputs; PlcOutputs : PlcOutputs; END_VAR - HwOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1; - HwOutputs._12a1_Acquisition_Control_1 := PlcOutputs._12a1_Acquisition_Control_1; - HwOutputs._12a1_Inspection_Control_1 := PlcOutputs._12a1_Inspection_Control_1; - HwOutputs._12a1_Command_Control_1 := PlcOutputs._12a1_Command_Control_1; - HwOutputs._12a1_SoftEvent_Control_1 := PlcOutputs._12a1_SoftEvent_Control_1; - HwOutputs._12a1_User_Data_64_bytes_1[0] := PlcOutputs._12a1_User_Data_64_bytes_1[0]; - HwOutputs._12a1_User_Data_64_bytes_1[1] := PlcOutputs._12a1_User_Data_64_bytes_1[1]; - HwOutputs._12a1_User_Data_64_bytes_1[2] := PlcOutputs._12a1_User_Data_64_bytes_1[2]; - HwOutputs._12a1_User_Data_64_bytes_1[3] := PlcOutputs._12a1_User_Data_64_bytes_1[3]; - HwOutputs._12a1_User_Data_64_bytes_1[4] := PlcOutputs._12a1_User_Data_64_bytes_1[4]; - HwOutputs._12a1_User_Data_64_bytes_1[5] := PlcOutputs._12a1_User_Data_64_bytes_1[5]; - HwOutputs._12a1_User_Data_64_bytes_1[6] := PlcOutputs._12a1_User_Data_64_bytes_1[6]; - HwOutputs._12a1_User_Data_64_bytes_1[7] := PlcOutputs._12a1_User_Data_64_bytes_1[7]; - HwOutputs._12a1_User_Data_64_bytes_1[8] := PlcOutputs._12a1_User_Data_64_bytes_1[8]; - HwOutputs._12a1_User_Data_64_bytes_1[9] := PlcOutputs._12a1_User_Data_64_bytes_1[9]; - HwOutputs._12a1_User_Data_64_bytes_1[10] := PlcOutputs._12a1_User_Data_64_bytes_1[10]; - HwOutputs._12a1_User_Data_64_bytes_1[11] := PlcOutputs._12a1_User_Data_64_bytes_1[11]; - HwOutputs._12a1_User_Data_64_bytes_1[12] := PlcOutputs._12a1_User_Data_64_bytes_1[12]; - HwOutputs._12a1_User_Data_64_bytes_1[13] := PlcOutputs._12a1_User_Data_64_bytes_1[13]; - HwOutputs._12a1_User_Data_64_bytes_1[14] := PlcOutputs._12a1_User_Data_64_bytes_1[14]; - HwOutputs._12a1_User_Data_64_bytes_1[15] := PlcOutputs._12a1_User_Data_64_bytes_1[15]; - HwOutputs._12a1_User_Data_64_bytes_1[16] := PlcOutputs._12a1_User_Data_64_bytes_1[16]; - HwOutputs._12a1_User_Data_64_bytes_1[17] := PlcOutputs._12a1_User_Data_64_bytes_1[17]; - HwOutputs._12a1_User_Data_64_bytes_1[18] := PlcOutputs._12a1_User_Data_64_bytes_1[18]; - HwOutputs._12a1_User_Data_64_bytes_1[19] := PlcOutputs._12a1_User_Data_64_bytes_1[19]; - HwOutputs._12a1_User_Data_64_bytes_1[20] := PlcOutputs._12a1_User_Data_64_bytes_1[20]; - HwOutputs._12a1_User_Data_64_bytes_1[21] := PlcOutputs._12a1_User_Data_64_bytes_1[21]; - HwOutputs._12a1_User_Data_64_bytes_1[22] := PlcOutputs._12a1_User_Data_64_bytes_1[22]; - HwOutputs._12a1_User_Data_64_bytes_1[23] := PlcOutputs._12a1_User_Data_64_bytes_1[23]; - HwOutputs._12a1_User_Data_64_bytes_1[24] := PlcOutputs._12a1_User_Data_64_bytes_1[24]; - HwOutputs._12a1_User_Data_64_bytes_1[25] := PlcOutputs._12a1_User_Data_64_bytes_1[25]; - HwOutputs._12a1_User_Data_64_bytes_1[26] := PlcOutputs._12a1_User_Data_64_bytes_1[26]; - HwOutputs._12a1_User_Data_64_bytes_1[27] := PlcOutputs._12a1_User_Data_64_bytes_1[27]; - HwOutputs._12a1_User_Data_64_bytes_1[28] := PlcOutputs._12a1_User_Data_64_bytes_1[28]; - HwOutputs._12a1_User_Data_64_bytes_1[29] := PlcOutputs._12a1_User_Data_64_bytes_1[29]; - HwOutputs._12a1_User_Data_64_bytes_1[30] := PlcOutputs._12a1_User_Data_64_bytes_1[30]; - HwOutputs._12a1_User_Data_64_bytes_1[31] := PlcOutputs._12a1_User_Data_64_bytes_1[31]; - HwOutputs._12a1_User_Data_64_bytes_1[32] := PlcOutputs._12a1_User_Data_64_bytes_1[32]; - HwOutputs._12a1_User_Data_64_bytes_1[33] := PlcOutputs._12a1_User_Data_64_bytes_1[33]; - HwOutputs._12a1_User_Data_64_bytes_1[34] := PlcOutputs._12a1_User_Data_64_bytes_1[34]; - HwOutputs._12a1_User_Data_64_bytes_1[35] := PlcOutputs._12a1_User_Data_64_bytes_1[35]; - HwOutputs._12a1_User_Data_64_bytes_1[36] := PlcOutputs._12a1_User_Data_64_bytes_1[36]; - HwOutputs._12a1_User_Data_64_bytes_1[37] := PlcOutputs._12a1_User_Data_64_bytes_1[37]; - HwOutputs._12a1_User_Data_64_bytes_1[38] := PlcOutputs._12a1_User_Data_64_bytes_1[38]; - HwOutputs._12a1_User_Data_64_bytes_1[39] := PlcOutputs._12a1_User_Data_64_bytes_1[39]; - HwOutputs._12a1_User_Data_64_bytes_1[40] := PlcOutputs._12a1_User_Data_64_bytes_1[40]; - HwOutputs._12a1_User_Data_64_bytes_1[41] := PlcOutputs._12a1_User_Data_64_bytes_1[41]; - HwOutputs._12a1_User_Data_64_bytes_1[42] := PlcOutputs._12a1_User_Data_64_bytes_1[42]; - HwOutputs._12a1_User_Data_64_bytes_1[43] := PlcOutputs._12a1_User_Data_64_bytes_1[43]; - HwOutputs._12a1_User_Data_64_bytes_1[44] := PlcOutputs._12a1_User_Data_64_bytes_1[44]; - HwOutputs._12a1_User_Data_64_bytes_1[45] := PlcOutputs._12a1_User_Data_64_bytes_1[45]; - HwOutputs._12a1_User_Data_64_bytes_1[46] := PlcOutputs._12a1_User_Data_64_bytes_1[46]; - HwOutputs._12a1_User_Data_64_bytes_1[47] := PlcOutputs._12a1_User_Data_64_bytes_1[47]; - HwOutputs._12a1_User_Data_64_bytes_1[48] := PlcOutputs._12a1_User_Data_64_bytes_1[48]; - HwOutputs._12a1_User_Data_64_bytes_1[49] := PlcOutputs._12a1_User_Data_64_bytes_1[49]; - HwOutputs._12a1_User_Data_64_bytes_1[50] := PlcOutputs._12a1_User_Data_64_bytes_1[50]; - HwOutputs._12a1_User_Data_64_bytes_1[51] := PlcOutputs._12a1_User_Data_64_bytes_1[51]; - HwOutputs._12a1_User_Data_64_bytes_1[52] := PlcOutputs._12a1_User_Data_64_bytes_1[52]; - HwOutputs._12a1_User_Data_64_bytes_1[53] := PlcOutputs._12a1_User_Data_64_bytes_1[53]; - HwOutputs._12a1_User_Data_64_bytes_1[54] := PlcOutputs._12a1_User_Data_64_bytes_1[54]; - HwOutputs._12a1_User_Data_64_bytes_1[55] := PlcOutputs._12a1_User_Data_64_bytes_1[55]; - HwOutputs._12a1_User_Data_64_bytes_1[56] := PlcOutputs._12a1_User_Data_64_bytes_1[56]; - HwOutputs._12a1_User_Data_64_bytes_1[57] := PlcOutputs._12a1_User_Data_64_bytes_1[57]; - HwOutputs._12a1_User_Data_64_bytes_1[58] := PlcOutputs._12a1_User_Data_64_bytes_1[58]; - HwOutputs._12a1_User_Data_64_bytes_1[59] := PlcOutputs._12a1_User_Data_64_bytes_1[59]; - HwOutputs._12a1_User_Data_64_bytes_1[60] := PlcOutputs._12a1_User_Data_64_bytes_1[60]; - HwOutputs._12a1_User_Data_64_bytes_1[61] := PlcOutputs._12a1_User_Data_64_bytes_1[61]; - HwOutputs._12a1_User_Data_64_bytes_1[62] := PlcOutputs._12a1_User_Data_64_bytes_1[62]; - HwOutputs._12a1_User_Data_64_bytes_1[63] := PlcOutputs._12a1_User_Data_64_bytes_1[63]; HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; diff --git a/src/templates.simple/ctrl/src/IO/HwInputs.st b/src/templates.simple/ctrl/src/IO/HwInputs.st index 9dfa1760b..b7df6729a 100644 --- a/src/templates.simple/ctrl/src/IO/HwInputs.st +++ b/src/templates.simple/ctrl/src/IO/HwInputs.st @@ -1,15 +1,8 @@ TYPE HwInputs : STRUCT - _11a1_DI_8x24VDC_ST_1 AT %B0 : BYTE; - _11a1_DI_8x24VDC_ST_2 AT %B1 : BYTE; - _12a1_Acquisition_Status_1 AT %B2 : ARRAY[0..2] OF BYTE; - _12a1_Inspection_Status_1 AT %B5 : DWORD; - _12a1_Command_Control_1 AT %B9 : WORD; - _12a1_SoftEvent_Control_1 AT %B11 : BYTE; - _12a1_Results_64_bytes_1 AT %B12 : ARRAY[0..67] OF BYTE; - _10a1_Acquisition_Status_1 AT %B80 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 AT %B83 : BYTE; - _10a1_Soft_Event_Control_1 AT %B84 : BYTE; - _10a1_Result_Data_128_bytes_1 AT %B85 : ARRAY[0..135] OF BYTE; + _10a1_Acquisition_Status_1 AT %B82 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 AT %B85 : BYTE; + _10a1_Soft_Event_Control_1 AT %B86 : BYTE; + _10a1_Result_Data_128_bytes_1 AT %B87 : ARRAY[0..135] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/HwOutputs.st b/src/templates.simple/ctrl/src/IO/HwOutputs.st index 97d565aed..6c930f523 100644 --- a/src/templates.simple/ctrl/src/IO/HwOutputs.st +++ b/src/templates.simple/ctrl/src/IO/HwOutputs.st @@ -1,14 +1,8 @@ TYPE HwOutputs : STRUCT - _11a1_DQ_8x24VDC_0_5A_ST_1 AT %B0 : BYTE; - _12a1_Acquisition_Control_1 AT %B1 : BYTE; - _12a1_Inspection_Control_1 AT %B2 : BYTE; - _12a1_Command_Control_1 AT %B3 : WORD; - _12a1_SoftEvent_Control_1 AT %B5 : BYTE; - _12a1_User_Data_64_bytes_1 AT %B6 : ARRAY[0..63] OF BYTE; - _10a1_Acquisition_Control_1 AT %B70 : BYTE; - _10a1_Results_Control_1 AT %B71 : BYTE; - _10a1_Soft_Event_Control_1 AT %B72 : BYTE; - _10a1_User_Data_128_bytes_1 AT %B73 : ARRAY[0..131] OF BYTE; + _10a1_Acquisition_Control_1 AT %B72 : BYTE; + _10a1_Results_Control_1 AT %B73 : BYTE; + _10a1_Soft_Event_Control_1 AT %B74 : BYTE; + _10a1_User_Data_128_bytes_1 AT %B75 : ARRAY[0..131] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/PlcInputs.st b/src/templates.simple/ctrl/src/IO/PlcInputs.st index 7fe1d3a2a..97b3efc59 100644 --- a/src/templates.simple/ctrl/src/IO/PlcInputs.st +++ b/src/templates.simple/ctrl/src/IO/PlcInputs.st @@ -1,15 +1,8 @@ TYPE PlcInputs : STRUCT - _11a1_DI_8x24VDC_ST_1 : BYTE; - _11a1_DI_8x24VDC_ST_2 : BYTE; - _12a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _12a1_Inspection_Status_1 : DWORD; - _12a1_Command_Control_1 : WORD; - _12a1_SoftEvent_Control_1 : BYTE; - _12a1_Results_64_bytes_1 : ARRAY[0..67] OF BYTE; - _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/PlcOutputs.st b/src/templates.simple/ctrl/src/IO/PlcOutputs.st index 2ea4d4ab4..6389c2461 100644 --- a/src/templates.simple/ctrl/src/IO/PlcOutputs.st +++ b/src/templates.simple/ctrl/src/IO/PlcOutputs.st @@ -1,14 +1,8 @@ TYPE PlcOutputs : STRUCT - _11a1_DQ_8x24VDC_0_5A_ST_1 : BYTE; - _12a1_Acquisition_Control_1 : BYTE; - _12a1_Inspection_Control_1 : BYTE; - _12a1_Command_Control_1 : WORD; - _12a1_SoftEvent_Control_1 : BYTE; - _12a1_User_Data_64_bytes_1 : ARRAY[0..63] OF BYTE; - _10a1_Acquisition_Control_1 : BYTE; - _10a1_Results_Control_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + _10a1_Acquisition_Control_1 : BYTE; + _10a1_Results_Control_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; END_STRUCT; END_TYPE From 572f982c688995d3241d459e0c37e4b12b1f7dd4 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 28 Jul 2023 09:35:26 +0200 Subject: [PATCH 08/32] VAR_IN_OUT => REF_TO --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 43 +++++++++++-------- .../Tasks/AxoDatamanClearResultData.st | 9 ++-- .../v_6_0_0/Tasks/AxoDatamanRead.st | 6 ++- .../AxoDataman_SignalStates.st | 3 ++ src/integrations/ctrl/apax.yml | 3 +- src/templates.simple/ctrl/apax.yml | 6 +++ 6 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index bfba34167..a2452e944 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -11,9 +11,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _readTask : AxoDatamanRead; {#ix-attr:[ComponentHeader()]} {#ix-attr:[ReadOnly()]} - {#ix-attr:[RenderIgnore()]} {#ix-set:AttributeName = "<#Results#>"} + {#ix-attr:[RenderIgnore()]} Results : AxoDataman_Results; + {#ix-attr:[ComponentHeader()]} + {#ix-attr:[ReadOnly()]} + {#ix-set:AttributeName = "<#Results#>"} + sResults : STRING[246]; + {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentDetails("Tasks")]} @@ -118,8 +123,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _AcquisitionStatus.TriggerReady := AcquisitionStatus[0].%X0; _AcquisitionStatus.TriggerAcknowledge := AcquisitionStatus[0].%X1; _AcquisitionStatus.MissedAcquisition := AcquisitionStatus[0].%X3; - _AcquisitionStatus.TriggerID.%B0 := AcquisitionStatus[1]; //TODO check order of the bytes - _AcquisitionStatus.TriggerID.%B1 := AcquisitionStatus[2]; //TODO check order of the bytes + _AcquisitionStatus.TriggerID.%B1 := AcquisitionStatus[1]; + _AcquisitionStatus.TriggerID.%B0 := AcquisitionStatus[2]; _ResultsStatus.Decoding := ResultsStatus.%X0; _ResultsStatus.DecodeComplete := ResultsStatus.%X1; @@ -155,14 +160,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF(Config.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN - Results.Id.%B0 := ResultData[0]; //TODO check order of the bytes - Results.Id.%B1 := ResultData[1]; //TODO check order of the bytes - Results.Code.%B0 := ResultData[2]; //TODO check order of the bytes - Results.Code.%B1 := ResultData[3]; //TODO check order of the bytes - Results.Extended.%B0 := ResultData[4]; //TODO check order of the bytes - Results.Extended.%B1 := ResultData[5]; //TODO check order of the bytes - Results.Length.%B0 := ResultData[6]; //TODO check order of the bytes - Results.Length.%B1 := ResultData[7]; //TODO check order of the bytes + Results.Id.%B1 := ResultData[0]; + Results.Id.%B0 := ResultData[1]; + Results.Code.%B1 := ResultData[2]; + Results.Code.%B0 := ResultData[3]; + Results.Extended.%B1 := ResultData[4]; + Results.Extended.%B0 := ResultData[5]; + Results.Length.%B1 := ResultData[6]; + Results.Length.%B0 := ResultData[7]; END_IF; END_METHOD @@ -175,8 +180,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 UserData : ARRAY[*] OF BYTE; END_VAR - AcquisitionControl.%X0 := _AcquisitionControl.Trigger; - AcquisitionControl.%X1 := _AcquisitionControl.TriggerEnable; + AcquisitionControl.%X0 := _AcquisitionControl.TriggerEnable; + AcquisitionControl.%X1 := _AcquisitionControl.Trigger; ResultsControl.%X0 := _ResultsControl.EnableResultBuffering; ResultsControl.%X1 := _ResultsControl.ResultsAcknowledge; @@ -209,10 +214,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF(Config.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN - UserData[0] := User.Option.%B0; //TODO check order of the bytes - UserData[1] := User.Option.%B1; //TODO check order of the bytes - UserData[2] := User.Length.%B0; //TODO check order of the bytes - UserData[3] := User.Length.%B0; //TODO check order of the bytes + UserData[0] := User.Option.%B1; + UserData[1] := User.Option.%B0; + UserData[2] := User.Length.%B1; + UserData[3] := User.Length.%B0; END_IF; END_METHOD @@ -302,14 +307,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************CLEAR*DATA***************** _taskDisabled := _taskDisabled OR _updateSignalStatesTask.IsBusy(); _clearResultDataTask.IsDisabled := _taskDisabled; - _clearResultDataTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,Config,Status,Results); + _clearResultDataTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,Config,Status,Results,sResults); //**************************************** //*************READ*********************** _taskDisabled := _taskDisabled OR _clearResultDataTask.IsBusy(); _readTask.IsDisabled := _taskDisabled; - _readTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,ResultData,Config,Status,Results); + _readTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,ResultData,Config,Status,Results,sResults); //**************************************** THIS.UpdateOutputs(AcquisitionControl,ResultsControl,SoftEventControl,UserData); diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 6d9f7d15f..0e337fb2c 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -22,9 +22,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 AcquisitionStatus : AxoDataman_AcquisitionStatus; ResultsControl : AxoDataman_ResultsControl; ResultsStatus : AxoDataman_ResultsStatus; - Config : AxoDataman_Config; - Status : AxoDataman_Status; - Results : AxoDataman_Results; + Config : AxoDataman_Config; + Status : AxoDataman_Status; + Results : AxoDataman_Results; + sResults : STRING[246]; END_VAR VAR @@ -71,6 +72,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 FOR _index := 0 TO 245 DO Results.Data[_index] := BYTE#0; END_FOR; + sResults := ''; //IF Tc2_System.MEMSET(destAddr:= ADR(THIS^.inoResults.Data) , fillByte:= 0 , n:= SIZEOF(THIS^.inoResults.Data)) >0 THEN THIS.CallTimers(FALSE); _progress := _progress + 1; @@ -95,6 +97,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.CallTimers(TRUE); THIS.ThrowWhen(_errorTimer.output); + Status.SignalStatus.Progress := _progress; END_IF; END_METHOD diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index e16270365..dcdea1abf 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -26,6 +26,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Config : AxoDataman_Config; Status : AxoDataman_Status; Results : AxoDataman_Results; + sResults : STRING[246]; END_VAR VAR @@ -112,7 +113,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 FOR _index := TO_INT(Results.Length) TO 245 DO Results.Data[_index] := BYTE#0; END_FOR; - + System.SerDe.Deserialize(UINT#7, ResultData, sResults); AcquisitionControl.Trigger := FALSE; ResultsControl.EnableResultBuffering := FALSE; ResultsControl.ResultsAcknowledge := TRUE; @@ -123,7 +124,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.CallTimers(TRUE); THIS.ThrowWhen(_errorTimer.output); - + + Status.SignalStatus.Progress := _progress; END_IF; END_METHOD diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st index 4ccd67c25..3e2a083f1 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st @@ -44,6 +44,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ResultExtended : UINT; {attribute addProperty Name "<#Result length#>"} ResultLength : UINT; + + {attribute addProperty Name "<#Progress: just for debugging#>"} + Progress : INT; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index f738a37f7..bfb22d2f6 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -13,7 +13,8 @@ dependencies: "@ix-ax/axopen.probers": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' - + "@ax/system-serde": ^2.0.2 + variables: APAX_BUILD_ARGS: [ -d ] diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index 4869db6e8..d6cceb8ea 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -30,3 +30,9 @@ scripts: # --default-server-interface is a must if you are using WebAPI - apax sld --accept-security-disclaimer -t 10.10.10.1 -i .\\bin\\1500\\ -r --default-server-interface + watch: + - dotnet watch --project + ..\\axosimple.app\\axosimple.hmi.csproj + da: + - apax download + - apax watch From 0e703223caaccadd742fc628da189200ffd83db2 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 28 Jul 2023 11:42:37 +0200 Subject: [PATCH 09/32] Changed to Var_IN_OUT --- .../AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index 28a9dd4c2..3ef514000 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -20,13 +20,13 @@ NAMESPACE AxoCognexVisionDatamanExamples END_IF; // Calling the main method `Run` with respective input and output variables. MyDataman.Run( parent := THIS, + AcquisitionControl := PlcOutputs^._10a1_Acquisition_Control_1, AcquisitionStatus := PlcInputs^._10a1_Acquisition_Status_1, + ResultsControl := PlcOutputs^._10a1_Results_Control_1, ResultsStatus := PlcInputs^._10a1_Results_Status_1, + SoftEventControl := PlcOutputs^._10a1_Soft_Event_Control_1, SoftEventStatus := PlcInputs^._10a1_Soft_Event_Control_1, ResultData := PlcInputs^._10a1_Result_Data_128_bytes_1, - AcquisitionControl := PlcOutputs^._10a1_Acquisition_Control_1, - ResultsControl := PlcOutputs^._10a1_Results_Control_1, - SoftEventControl := PlcOutputs^._10a1_Soft_Event_Control_1, UserData := PlcOutputs^._10a1_User_Data_128_bytes_1); END_METHOD END_CLASS From d3d97e06d4ef3909afa68cc57c2ff0f8d4184860 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 28 Jul 2023 15:20:42 +0200 Subject: [PATCH 10/32] wip --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 112 +++++++++--------- .../Tasks/AxoDatamanClearResultData.st | 19 ++- .../v_6_0_0/Tasks/AxoDatamanRead.st | 20 +--- .../AxoDataman_Config.st | 3 - .../AxoDataman_Results.st | 6 +- .../AxoDataman_SignalStates.st | 40 +++---- .../AxoDataman_Status.st | 2 + 7 files changed, 94 insertions(+), 108 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index a2452e944..c4f8551e6 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -6,18 +6,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoDataman EXTENDS AXOpen.Core.AxoComponent IMPLEMENTS AXOpen.Components.Abstractions.IAxoCodeReader VAR PUBLIC {#ix-attr:[Container(Layout.Wrap)]} - {#ix-attr:[ComponentHeader()]} + {#ix-attr:[ComponentHeader()]} {#ix-set:AttributeName = "<#Read#>"} _readTask : AxoDatamanRead; {#ix-attr:[ComponentHeader()]} {#ix-attr:[ReadOnly()]} {#ix-set:AttributeName = "<#Results#>"} - {#ix-attr:[RenderIgnore()]} Results : AxoDataman_Results; - {#ix-attr:[ComponentHeader()]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Results#>"} - sResults : STRING[246]; {#ix-attr:[Container(Layout.Wrap)]} @@ -34,7 +29,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentDetails("Config")]} - {#ix-attr:[ReadOnly()]} Config : AxoDataman_Config; {#ix-attr:[Container(Layout.Wrap)]} @@ -42,16 +36,27 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[ReadOnly()]} Status : AxoDataman_Status; - {#ix-attr:[Container(Layout.Wrap)]} - {#ix-attr:[ComponentDetails("User data")]} + // {#ix-attr:[Container(Layout.Wrap)]} + // {#ix-attr:[ComponentDetails("User data")]} + {#ix-attr:[RenderIgnore()]} User : AxoDataman_User; - END_VAR - VAR PRIVATE + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Signal tests")]} _AcquisitionControl : AxoDataman_AcquisitionControl; + {#ix-attr:[ComponentDetails("Signal tests")]} _AcquisitionStatus : AxoDataman_AcquisitionStatus; + {#ix-attr:[ComponentDetails("Signal tests")]} _ResultsControl : AxoDataman_ResultsControl; + {#ix-attr:[ComponentDetails("Signal tests")]} _ResultsStatus : AxoDataman_ResultsStatus; + END_VAR + + VAR PRIVATE + // _AcquisitionControl : AxoDataman_AcquisitionControl; + // _AcquisitionStatus : AxoDataman_AcquisitionStatus; + // _ResultsControl : AxoDataman_ResultsControl; + // _ResultsStatus : AxoDataman_ResultsStatus; _SoftEventControl : AxoDataman_SoftEventControl; _SoftEventStatus : AxoDataman_SoftEventStatus; _taskDisabled : BOOL; @@ -73,12 +78,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Results.Extended := UINT#0; Results.Id := UINT#0; Results.Length := UINT#0; - - FOR _index := 0 TO 245 DO - Results.Data[_index] := BYTE#0; - END_FOR; + Results.Data := ''; - _AcquisitionControl.TriggerEnable := FALSE; + _AcquisitionControl.TriggerEnable := _ResultsStatus.ErrorDetected; _AcquisitionControl.Trigger := FALSE; _ResultsControl.EnableResultBuffering := FALSE; @@ -99,8 +101,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 User.Data[_index] := BYTE#0; END_FOR; - Status.ActionDescription := '<#Restore executed!#>'; - _restoreTask.Restore(); + IF NOT _ResultsStatus.ErrorDetected THEN + Status.ActionDescription := '<#Restore executed!#>'; + _restoreTask.DoneWhen(TRUE); + END_IF; END_METHOD /// @@ -111,12 +115,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PRIVATE UpdateInputs - VAR_INPUT + VAR_IN_OUT AcquisitionStatus : ARRAY[0..2] OF BYTE; ResultsStatus : BYTE; SoftEventStatus : BYTE; - END_VAR - VAR_IN_OUT ResultData : ARRAY[*] OF BYTE; END_VAR @@ -143,23 +145,23 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF (LOWER_BOUND(ResultData,1) = 0) THEN IF (UPPER_BOUND(ResultData,1) = 23) THEN - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_16B; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_16B; ELSIF (UPPER_BOUND(ResultData,1) = 39) THEN - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_32B; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_32B; ELSIF (UPPER_BOUND(ResultData,1) = 71) THEN - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; ELSIF (UPPER_BOUND(ResultData,1) = 135) THEN - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_128B; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_128B; ELSIF (UPPER_BOUND(ResultData,1) = 253) THEN - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; ELSE - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; ELSE - Config.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; + Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; - IF(Config.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN + IF(Status.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN Results.Id.%B1 := ResultData[0]; Results.Id.%B0 := ResultData[1]; Results.Code.%B1 := ResultData[2]; @@ -197,23 +199,23 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF (LOWER_BOUND(UserData,1) = 0) THEN IF (UPPER_BOUND(UserData,1) = 19) THEN - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_16B; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_16B; ELSIF (UPPER_BOUND(UserData,1) = 35) THEN - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_32B; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_32B; ELSIF (UPPER_BOUND(UserData,1) = 67) THEN - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; ELSIF (UPPER_BOUND(UserData,1) = 131) THEN - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_128B; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_128B; ELSIF (UPPER_BOUND(UserData,1) = 253) THEN - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; END_IF; ELSE - Config.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; END_IF; - IF(Config.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN + IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN UserData[0] := User.Option.%B1; UserData[1] := User.Option.%B0; UserData[2] := User.Length.%B1; @@ -228,59 +230,57 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT parent : IAxoObject; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsStatus : BYTE; - SoftEventStatus : BYTE; END_VAR VAR_IN_OUT - ResultData : ARRAY[*] OF BYTE; AcquisitionControl : BYTE; + AcquisitionStatus : ARRAY[0..2] OF BYTE; ResultsControl : BYTE; + ResultsStatus : BYTE; SoftEventControl : BYTE; + SoftEventStatus : BYTE; + ResultData : ARRAY[*] OF BYTE; UserData : ARRAY[*] OF BYTE; END_VAR THIS.Initialize(parent); THIS.Open(); - THIS.Execute(AcquisitionStatus,ResultsStatus,SoftEventStatus,ResultData,AcquisitionControl,ResultsControl,SoftEventControl,UserData); + THIS.Execute(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData); THIS.Close(); END_METHOD METHOD PUBLIC Run VAR_INPUT parent : IAxoContext; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsStatus : BYTE; - SoftEventStatus : BYTE; END_VAR VAR_IN_OUT - ResultData : ARRAY[*] OF BYTE; AcquisitionControl : BYTE; + AcquisitionStatus : ARRAY[0..2] OF BYTE; ResultsControl : BYTE; + ResultsStatus : BYTE; SoftEventControl : BYTE; + SoftEventStatus : BYTE; + ResultData : ARRAY[*] OF BYTE; UserData : ARRAY[*] OF BYTE; END_VAR THIS.Initialize(parent); THIS.Open(); - THIS.Execute(AcquisitionStatus,ResultsStatus,SoftEventStatus,ResultData,AcquisitionControl,ResultsControl,SoftEventControl,UserData); + THIS.Execute(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData); THIS.Close(); END_METHOD METHOD PRIVATE Execute - VAR_INPUT - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsStatus : BYTE; - SoftEventStatus : BYTE; - END_VAR VAR_IN_OUT - ResultData : ARRAY[*] OF BYTE; AcquisitionControl : BYTE; + AcquisitionStatus : ARRAY[0..2] OF BYTE; ResultsControl : BYTE; + ResultsStatus : BYTE; SoftEventControl : BYTE; + SoftEventStatus : BYTE; + ResultData : ARRAY[*] OF BYTE; UserData : ARRAY[*] OF BYTE; END_VAR - + _restoreTask.Initialize(THIS); _updateSignalStatesTask.Initialize(THIS); _clearResultDataTask.Initialize(THIS); @@ -307,14 +307,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************CLEAR*DATA***************** _taskDisabled := _taskDisabled OR _updateSignalStatesTask.IsBusy(); _clearResultDataTask.IsDisabled := _taskDisabled; - _clearResultDataTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,Config,Status,Results,sResults); + _clearResultDataTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,Config,Status,Results); //**************************************** //*************READ*********************** _taskDisabled := _taskDisabled OR _clearResultDataTask.IsBusy(); _readTask.IsDisabled := _taskDisabled; - _readTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,ResultData,Config,Status,Results,sResults); + _readTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,ResultData,Config,Status,Results); //**************************************** THIS.UpdateOutputs(AcquisitionControl,ResultsControl,SoftEventControl,UserData); diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 0e337fb2c..29a8bf727 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -25,7 +25,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Config : AxoDataman_Config; Status : AxoDataman_Status; Results : AxoDataman_Results; - sResults : STRING[246]; END_VAR VAR @@ -33,9 +32,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR IF THIS.Execute() THEN + _infoTime := Config.InfoTime; + _errorTime := Config.ErrorTime; IF _progress = 0 THEN - _infoTime := Config.InfoTime; - _errorTime := Config.ErrorTime; + // IF NOT __ISVALIDREF(inoIoData) THEN // _varInfo :=__VARINFO(inoIoData); // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); @@ -63,20 +63,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 AcquisitionControl.TriggerEnable := FALSE; AcquisitionControl.Trigger := FALSE; ResultsControl.ResultsAcknowledge := TRUE; - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the result data cleared!#>').Pin(); Results.Id := UINT#0; Results.Code := UINT#0; Results.Extended := UINT#0; Results.Length := UINT#0; - FOR _index := 0 TO 245 DO - Results.Data[_index] := BYTE#0; - END_FOR; - sResults := ''; - //IF Tc2_System.MEMSET(destAddr:= ADR(THIS^.inoResults.Data) , fillByte:= 0 , n:= SIZEOF(THIS^.inoResults.Data)) >0 THEN - THIS.CallTimers(FALSE); - _progress := _progress + 1; - //END_IF; + Results.Data := ''; + THIS.CallTimers(FALSE); + _progress := _progress + 1; END_IF; IF _progress = 3 THEN @@ -115,5 +109,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _progress := 0; THIS.CallTimers(FALSE); END_METHOD + END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index dcdea1abf..f5e62df6b 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -26,7 +26,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Config : AxoDataman_Config; Status : AxoDataman_Status; Results : AxoDataman_Results; - sResults : STRING[246]; END_VAR VAR @@ -96,24 +95,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 6 THEN - THIS.ThrowWhen(Results.Code = UINT#0 OR Results.Length=UINT#0 OR Results.Length > TO_UINT(Config.ResultDataSize)); - // THIS^.inoResults.Length := THIS^.inoIoData.ResultData.ResultLength; - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the ResultData copied!#>').Pin(); - // IF Tc2_System.MEMCPY(srcAddr := ADR(THIS^.inoIoData.ResultData.ResultData) , destAddr:= ADR(THIS^.inoResults.Data) , n:= THIS^.inoResults.Length) > 0 AND - // Tc2_System.MEMSET(destAddr:= ADR(THIS^.inoResults.Data) + THIS^.inoResults.Length, fillByte:= 0 , n:= SIZEOF(THIS^.inoResults.Data) - THIS^.inoResults.Length)>0 THEN - THIS.CallTimers(FALSE); - _progress := _progress + 1; - // END_IF; + THIS.ThrowWhen(Results.Code = UINT#0 OR Results.Length=UINT#0 OR Results.Length > TO_UINT(Status.ResultDataSize)); + THIS.CallTimers(FALSE); + _progress := _progress + 1; END_IF; IF _progress = 7 THEN - FOR _index := 0 TO (TO_INT(Results.Length) - 1) DO - Results.Data[_index] := ResultData[_index + 8]; - END_FOR; - FOR _index := TO_INT(Results.Length) TO 245 DO - Results.Data[_index] := BYTE#0; - END_FOR; - System.SerDe.Deserialize(UINT#7, ResultData, sResults); + System.SerDe.Deserialize(UINT#7, ResultData, Results.Data); AcquisitionControl.Trigger := FALSE; ResultsControl.EnableResultBuffering := FALSE; ResultsControl.ResultsAcknowledge := TRUE; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st index d35997e37..fa152e4e0 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st @@ -5,9 +5,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Stack)]} AxoDataman_Config : STRUCT - ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; - UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; - DataFormat : Endianness := Endianness#Big; ContinuousReading : BOOL := FALSE; InfoTime : LTIME := LT#2S; ErrorTime : LTIME := LT#5S; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st index c777672d3..ae492f8b9 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st @@ -2,11 +2,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_Results : STRUCT + {#ix-attr:[RenderIgnore()]} Id: UINT; + {#ix-attr:[RenderIgnore()]} Code: UINT; + {#ix-attr:[RenderIgnore()]} Extended: UINT; + {#ix-attr:[RenderIgnore()]} Length : UINT; - Data : ARRAY[0..245] OF BYTE; + Data : STRING[246]; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st index 3e2a083f1..991d5710b 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st @@ -1,51 +1,51 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE - {attribute addProperty Name "<#Signal states#>"} + {#ix-set:AttributeName = "<#Signal states#>"} {#ix-attr:[Container(Layout.Wrap)]} AxoDataman_SignalStates : STRUCT - {attribute addProperty Name "<#Trigger enable#>"} + {#ix-set:AttributeName = "<#Trigger enable#>"} TriggerEnable : BOOL; - {attribute addProperty Name "<#Trigger#>"} + {#ix-set:AttributeName = "<#Trigger#>"} Trigger : BOOL; - {attribute addProperty Name "<#Enable result buffering#>"} + {#ix-set:AttributeName = "<#Enable result buffering#>"} EnableResultBuffering : BOOL; - {attribute addProperty Name "<#Result acknowledge#>"} + {#ix-set:AttributeName = "<#Result acknowledge#>"} ResultsAcknowledge : BOOL; - {attribute addProperty Name "<#Trigger ready#>"} + {#ix-set:AttributeName = "<#Trigger ready#>"} TriggerReady : BOOL; - {attribute addProperty Name "<#Trigger acknowledge#>"} + {#ix-set:AttributeName = "<#Trigger acknowledge#>"} TriggerAcknowledge : BOOL; - {attribute addProperty Name "<#Acquiring#>"} + {#ix-set:AttributeName = "<#Acquiring#>"} Acquiring : BOOL; - {attribute addProperty Name "<#Missed acquisition#>"} + {#ix-set:AttributeName = "<#Missed acquisition#>"} MissedAcquisition : BOOL; - {attribute addProperty Name "<#Trigger ID#>"} + {#ix-set:AttributeName = "<#Trigger ID#>"} TriggerID : UINT; - {attribute addProperty Name "<#Decoding#>"} + {#ix-set:AttributeName = "<#Decoding#>"} Decoding : BOOL; - {attribute addProperty Name "<#Decode complete#>"} + {#ix-set:AttributeName = "<#Decode complete#>"} DecodeComplete : BOOL; - {attribute addProperty Name "<#Result buffer overrun#>"} + {#ix-set:AttributeName = "<#Result buffer overrun#>"} ResultsBufferOverrun : BOOL; - {attribute addProperty Name "<#Results available#>"} + {#ix-set:AttributeName = "<#Results available#>"} ResultsAvailable : BOOL; - {attribute addProperty Name "<#Error detected#>"} + {#ix-set:AttributeName = "<#Error detected#>"} ErrorDetected : BOOL; - {attribute addProperty Name "<#Result ID#>"} + {#ix-set:AttributeName = "<#Result ID#>"} ResultID : UINT; - {attribute addProperty Name "<#Result code#>"} + {#ix-set:AttributeName = "<#Result code#>"} ResultCode : UINT; - {attribute addProperty Name "<#Result extended#>"} + {#ix-set:AttributeName = "<#Result extended#>"} ResultExtended : UINT; - {attribute addProperty Name "<#Result length#>"} + {#ix-set:AttributeName = "<#Result length#>"} ResultLength : UINT; - {attribute addProperty Name "<#Progress: just for debugging#>"} + {#ix-set:AttributeName = "<#Progress: just for debugging#>"} Progress : INT; END_STRUCT; END_TYPE diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index ab349dfcf..0f5b3aa64 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -5,6 +5,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 STRUCT ActionDescription : STRING[100]; SignalStatus : AxoDataman_SignalStates; + ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; + UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file From 91b0812580696baebd15110877803eef44b21733 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 28 Jul 2023 15:36:02 +0200 Subject: [PATCH 11/32] VAR_IN_OUT --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index c4f8551e6..9eff4e567 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -229,17 +229,17 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT - parent : IAxoObject; + parent : IAxoObject; END_VAR VAR_IN_OUT - AcquisitionControl : BYTE; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsControl : BYTE; - ResultsStatus : BYTE; - SoftEventControl : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; - UserData : ARRAY[*] OF BYTE; + AcquisitionControl : BYTE; + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsControl : BYTE; + ResultsStatus : BYTE; + SoftEventControl : BYTE; + SoftEventStatus : BYTE; + ResultData : ARRAY[*] OF BYTE; + UserData : ARRAY[*] OF BYTE; END_VAR THIS.Initialize(parent); @@ -250,17 +250,17 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT - parent : IAxoContext; + parent : IAxoContext; END_VAR VAR_IN_OUT - AcquisitionControl : BYTE; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsControl : BYTE; - ResultsStatus : BYTE; - SoftEventControl : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; - UserData : ARRAY[*] OF BYTE; + AcquisitionControl : BYTE; + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsControl : BYTE; + ResultsStatus : BYTE; + SoftEventControl : BYTE; + SoftEventStatus : BYTE; + ResultData : ARRAY[*] OF BYTE; + UserData : ARRAY[*] OF BYTE; END_VAR THIS.Initialize(parent); @@ -271,14 +271,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PRIVATE Execute VAR_IN_OUT - AcquisitionControl : BYTE; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsControl : BYTE; - ResultsStatus : BYTE; - SoftEventControl : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; - UserData : ARRAY[*] OF BYTE; + AcquisitionControl : BYTE; + AcquisitionStatus : ARRAY[0..2] OF BYTE; + ResultsControl : BYTE; + ResultsStatus : BYTE; + SoftEventControl : BYTE; + SoftEventStatus : BYTE; + ResultData : ARRAY[*] OF BYTE; + UserData : ARRAY[*] OF BYTE; END_VAR _restoreTask.Initialize(THIS); From c8d3b1f7a41eef68b32f94566f82b34187dee66e Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 28 Jul 2023 17:32:13 +0200 Subject: [PATCH 12/32] changed to VAR_INPUT and REF_TO --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 194 +++++++++--------- .../Tasks/AxoDatamanClearResultData.st | 78 ++++--- .../v_6_0_0/Tasks/AxoDatamanRead.st | 115 ++++++++--- .../AxoDataman_Status.st | 1 + .../AxoCognexVisionDatamanExample.st | 16 +- 5 files changed, 245 insertions(+), 159 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 9eff4e567..0251a57de 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -115,44 +115,44 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PRIVATE UpdateInputs - VAR_IN_OUT - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsStatus : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; + VAR_INPUT + AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + ResultsStatus : REF_TO BYTE; + SoftEventStatus : REF_TO BYTE; + ResultData : REF_TO ARRAY[*] OF BYTE; END_VAR - _AcquisitionStatus.TriggerReady := AcquisitionStatus[0].%X0; - _AcquisitionStatus.TriggerAcknowledge := AcquisitionStatus[0].%X1; - _AcquisitionStatus.MissedAcquisition := AcquisitionStatus[0].%X3; - _AcquisitionStatus.TriggerID.%B1 := AcquisitionStatus[1]; - _AcquisitionStatus.TriggerID.%B0 := AcquisitionStatus[2]; - - _ResultsStatus.Decoding := ResultsStatus.%X0; - _ResultsStatus.DecodeComplete := ResultsStatus.%X1; - _ResultsStatus.ResultsBufferOverrun := ResultsStatus.%X2; - _ResultsStatus.ResultsAvailable := ResultsStatus.%X3; - _ResultsStatus.ErrorDetected := ResultsStatus.%X7; - - _SoftEventStatus.TrainCodeAcknowledge := SoftEventStatus.%X0; - _SoftEventStatus.TrainMatchStringAcknowledge := SoftEventStatus.%X1; - _SoftEventStatus.TrainFocusAcknowledge := SoftEventStatus.%X2; - _SoftEventStatus.TrainBrightnessAcknowledge := SoftEventStatus.%X3; - _SoftEventStatus.UntrainAcknowledge := SoftEventStatus.%X4; - _SoftEventStatus.ExecuteDmccAcknowledge := SoftEventStatus.%X5; - _SoftEventStatus.Reserved06 := SoftEventStatus.%X6; - _SoftEventStatus.SetMatchStringAcknowledge := SoftEventStatus.%X7; - - IF (LOWER_BOUND(ResultData,1) = 0) THEN - IF (UPPER_BOUND(ResultData,1) = 23) THEN + _AcquisitionStatus.TriggerReady := AcquisitionStatus^[0].%X0; + _AcquisitionStatus.TriggerAcknowledge := AcquisitionStatus^[0].%X1; + _AcquisitionStatus.MissedAcquisition := AcquisitionStatus^[0].%X3; + _AcquisitionStatus.TriggerID.%B1 := AcquisitionStatus^[1]; + _AcquisitionStatus.TriggerID.%B0 := AcquisitionStatus^[2]; + + _ResultsStatus.Decoding := ResultsStatus^.%X0; + _ResultsStatus.DecodeComplete := ResultsStatus^.%X1; + _ResultsStatus.ResultsBufferOverrun := ResultsStatus^.%X2; + _ResultsStatus.ResultsAvailable := ResultsStatus^.%X3; + _ResultsStatus.ErrorDetected := ResultsStatus^.%X7; + + _SoftEventStatus.TrainCodeAcknowledge := SoftEventStatus^.%X0; + _SoftEventStatus.TrainMatchStringAcknowledge := SoftEventStatus^.%X1; + _SoftEventStatus.TrainFocusAcknowledge := SoftEventStatus^.%X2; + _SoftEventStatus.TrainBrightnessAcknowledge := SoftEventStatus^.%X3; + _SoftEventStatus.UntrainAcknowledge := SoftEventStatus^.%X4; + _SoftEventStatus.ExecuteDmccAcknowledge := SoftEventStatus^.%X5; + _SoftEventStatus.Reserved06 := SoftEventStatus^.%X6; + _SoftEventStatus.SetMatchStringAcknowledge := SoftEventStatus^.%X7; + + IF (LOWER_BOUND(ResultData^,1) = 0) THEN + IF (UPPER_BOUND(ResultData^,1) = 23) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_16B; - ELSIF (UPPER_BOUND(ResultData,1) = 39) THEN + ELSIF (UPPER_BOUND(ResultData^,1) = 39) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_32B; - ELSIF (UPPER_BOUND(ResultData,1) = 71) THEN + ELSIF (UPPER_BOUND(ResultData^,1) = 71) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; - ELSIF (UPPER_BOUND(ResultData,1) = 135) THEN + ELSIF (UPPER_BOUND(ResultData^,1) = 135) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_128B; - ELSIF (UPPER_BOUND(ResultData,1) = 253) THEN + ELSIF (UPPER_BOUND(ResultData^,1) = 253) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; ELSE Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; @@ -162,51 +162,51 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF(Status.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN - Results.Id.%B1 := ResultData[0]; - Results.Id.%B0 := ResultData[1]; - Results.Code.%B1 := ResultData[2]; - Results.Code.%B0 := ResultData[3]; - Results.Extended.%B1 := ResultData[4]; - Results.Extended.%B0 := ResultData[5]; - Results.Length.%B1 := ResultData[6]; - Results.Length.%B0 := ResultData[7]; + Results.Id.%B1 := ResultData^[0]; + Results.Id.%B0 := ResultData^[1]; + Results.Code.%B1 := ResultData^[2]; + Results.Code.%B0 := ResultData^[3]; + Results.Extended.%B1 := ResultData^[4]; + Results.Extended.%B0 := ResultData^[5]; + Results.Length.%B1 := ResultData^[6]; + Results.Length.%B0 := ResultData^[7]; END_IF; END_METHOD METHOD PRIVATE UpdateOutputs - VAR_IN_OUT - AcquisitionControl : BYTE; - ResultsControl : BYTE; - SoftEventControl : BYTE; - UserData : ARRAY[*] OF BYTE; + VAR_INPUT + AcquisitionControl : REF_TO BYTE; + ResultsControl : REF_TO BYTE; + SoftEventControl : REF_TO BYTE; + UserData : REF_TO ARRAY[*] OF BYTE; END_VAR - AcquisitionControl.%X0 := _AcquisitionControl.TriggerEnable; - AcquisitionControl.%X1 := _AcquisitionControl.Trigger; + AcquisitionControl^.%X0 := _AcquisitionControl.TriggerEnable; + AcquisitionControl^.%X1 := _AcquisitionControl.Trigger; - ResultsControl.%X0 := _ResultsControl.EnableResultBuffering; - ResultsControl.%X1 := _ResultsControl.ResultsAcknowledge; + ResultsControl^.%X0 := _ResultsControl.EnableResultBuffering; + ResultsControl^.%X1 := _ResultsControl.ResultsAcknowledge; - SoftEventControl.%X0 := _SoftEventControl.TrainCode; - SoftEventControl.%X1 := _SoftEventControl.TrainMatchString; - SoftEventControl.%X2 := _SoftEventControl.TrainFocus; - SoftEventControl.%X3 := _SoftEventControl.TrainBrightness; - SoftEventControl.%X4 := _SoftEventControl.Untrain; - SoftEventControl.%X5 := _SoftEventControl.ExecuteDMCC; - SoftEventControl.%X6 := _SoftEventControl.Reserved06; - SoftEventControl.%X7 := _SoftEventControl.SetMatchString; - - IF (LOWER_BOUND(UserData,1) = 0) THEN - IF (UPPER_BOUND(UserData,1) = 19) THEN + SoftEventControl^.%X0 := _SoftEventControl.TrainCode; + SoftEventControl^.%X1 := _SoftEventControl.TrainMatchString; + SoftEventControl^.%X2 := _SoftEventControl.TrainFocus; + SoftEventControl^.%X3 := _SoftEventControl.TrainBrightness; + SoftEventControl^.%X4 := _SoftEventControl.Untrain; + SoftEventControl^.%X5 := _SoftEventControl.ExecuteDMCC; + SoftEventControl^.%X6 := _SoftEventControl.Reserved06; + SoftEventControl^.%X7 := _SoftEventControl.SetMatchString; + + IF (LOWER_BOUND(UserData^,1) = 0) THEN + IF (UPPER_BOUND(UserData^,1) = 19) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_16B; - ELSIF (UPPER_BOUND(UserData,1) = 35) THEN + ELSIF (UPPER_BOUND(UserData^,1) = 35) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_32B; - ELSIF (UPPER_BOUND(UserData,1) = 67) THEN + ELSIF (UPPER_BOUND(UserData^,1) = 67) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; - ELSIF (UPPER_BOUND(UserData,1) = 131) THEN + ELSIF (UPPER_BOUND(UserData^,1) = 131) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_128B; - ELSIF (UPPER_BOUND(UserData,1) = 253) THEN + ELSIF (UPPER_BOUND(UserData^,1) = 253) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; @@ -216,10 +216,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN - UserData[0] := User.Option.%B1; - UserData[1] := User.Option.%B0; - UserData[2] := User.Length.%B1; - UserData[3] := User.Length.%B0; + UserData^[0] := User.Option.%B1; + UserData^[1] := User.Option.%B0; + UserData^[2] := User.Length.%B1; + UserData^[3] := User.Length.%B0; END_IF; END_METHOD @@ -230,16 +230,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT parent : IAxoObject; - END_VAR - VAR_IN_OUT - AcquisitionControl : BYTE; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsControl : BYTE; - ResultsStatus : BYTE; - SoftEventControl : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; - UserData : ARRAY[*] OF BYTE; + AcquisitionControl : REF_TO BYTE; + AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + ResultsControl : REF_TO BYTE; + ResultsStatus : REF_TO BYTE; + SoftEventControl : REF_TO BYTE; + SoftEventStatus : REF_TO BYTE; + ResultData : REF_TO ARRAY[*] OF BYTE; + UserData : REF_TO ARRAY[*] OF BYTE; END_VAR THIS.Initialize(parent); @@ -251,16 +249,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT parent : IAxoContext; - END_VAR - VAR_IN_OUT - AcquisitionControl : BYTE; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsControl : BYTE; - ResultsStatus : BYTE; - SoftEventControl : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; - UserData : ARRAY[*] OF BYTE; + AcquisitionControl : REF_TO BYTE; + AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + ResultsControl : REF_TO BYTE; + ResultsStatus : REF_TO BYTE; + SoftEventControl : REF_TO BYTE; + SoftEventStatus : REF_TO BYTE; + ResultData : REF_TO ARRAY[*] OF BYTE; + UserData : REF_TO ARRAY[*] OF BYTE; END_VAR THIS.Initialize(parent); @@ -270,15 +266,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PRIVATE Execute - VAR_IN_OUT - AcquisitionControl : BYTE; - AcquisitionStatus : ARRAY[0..2] OF BYTE; - ResultsControl : BYTE; - ResultsStatus : BYTE; - SoftEventControl : BYTE; - SoftEventStatus : BYTE; - ResultData : ARRAY[*] OF BYTE; - UserData : ARRAY[*] OF BYTE; + VAR_INPUT + AcquisitionControl : REF_TO BYTE; + AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + ResultsControl : REF_TO BYTE; + ResultsStatus : REF_TO BYTE; + SoftEventControl : REF_TO BYTE; + SoftEventStatus : REF_TO BYTE; + ResultData : REF_TO ARRAY[*] OF BYTE; + UserData : REF_TO ARRAY[*] OF BYTE; END_VAR _restoreTask.Initialize(THIS); @@ -307,14 +303,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************CLEAR*DATA***************** _taskDisabled := _taskDisabled OR _updateSignalStatesTask.IsBusy(); _clearResultDataTask.IsDisabled := _taskDisabled; - _clearResultDataTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,Config,Status,Results); + _clearResultDataTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results)); //**************************************** //*************READ*********************** _taskDisabled := _taskDisabled OR _clearResultDataTask.IsBusy(); _readTask.IsDisabled := _taskDisabled; - _readTask.Run(_AcquisitionControl,_AcquisitionStatus,_ResultsControl,_ResultsStatus,ResultData,Config,Status,Results); + _readTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results),ResultData); //**************************************** THIS.UpdateOutputs(AcquisitionControl,ResultsControl,SoftEventControl,UserData); diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 29a8bf727..8b536f531 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -12,19 +12,21 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _Status : REF_TO AxoDataman_Status; END_VAR METHOD PUBLIC Run - VAR_IN_OUT - AcquisitionControl : AxoDataman_AcquisitionControl; - AcquisitionStatus : AxoDataman_AcquisitionStatus; - ResultsControl : AxoDataman_ResultsControl; - ResultsStatus : AxoDataman_ResultsStatus; - Config : AxoDataman_Config; - Status : AxoDataman_Status; - Results : AxoDataman_Results; + VAR_INPUT + AcquisitionControl : REF_TO AxoDataman_AcquisitionControl; + AcquisitionStatus : REF_TO AxoDataman_AcquisitionStatus; + ResultsControl : REF_TO AxoDataman_ResultsControl; + ResultsStatus : REF_TO AxoDataman_ResultsStatus; + Config : REF_TO AxoDataman_Config; + Status : REF_TO AxoDataman_Status; + Results : REF_TO AxoDataman_Results; + ResultData : REF_TO ARRAY[*] OF BYTE; END_VAR VAR @@ -32,8 +34,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR IF THIS.Execute() THEN - _infoTime := Config.InfoTime; - _errorTime := Config.ErrorTime; IF _progress = 0 THEN // IF NOT __ISVALIDREF(inoIoData) THEN @@ -50,39 +50,43 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); // ELSE _progress := _progress + 1; - // END_IF; + _infoTime := Config^.InfoTime; + _errorTime := Config^.ErrorTime; + _Status := Status; + + // END_IF; END_IF; IF _progress = 1 THEN - Status.ActionDescription := '<#Clearing of the result data running.#>'; + Status^.ActionDescription := '<#Clearing of the result data running.#>'; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 2 THEN - AcquisitionControl.TriggerEnable := FALSE; - AcquisitionControl.Trigger := FALSE; - ResultsControl.ResultsAcknowledge := TRUE; - Results.Id := UINT#0; - Results.Code := UINT#0; - Results.Extended := UINT#0; - Results.Length := UINT#0; + AcquisitionControl^.TriggerEnable := FALSE; + AcquisitionControl^.Trigger := FALSE; + ResultsControl^.ResultsAcknowledge := TRUE; + Results^.Id := UINT#0; + Results^.Code := UINT#0; + Results^.Extended := UINT#0; + Results^.Length := UINT#0; - Results.Data := ''; + Results^.Data := ''; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 3 THEN // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be reseted!#>').Pin(); - IF NOT ResultsStatus.ResultsAvailable THEN + IF NOT ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 4 THEN - ResultsControl.ResultsAcknowledge := FALSE; + ResultsControl^.ResultsAcknowledge := FALSE; THIS.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; @@ -91,7 +95,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.CallTimers(TRUE); THIS.ThrowWhen(_errorTimer.output); - Status.SignalStatus.Progress := _progress; + Status^.SignalStatus.Progress := _progress; END_IF; END_METHOD @@ -110,5 +114,29 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.CallTimers(FALSE); END_METHOD + METHOD PROTECTED OVERRIDE OnAbort + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Clearing of the result data was aborted, while not yet completed!#>'; + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE OnDone + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Clearing of the result data was completed successfully.#>'; + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE OnError + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Clearing of the result data finished with error.#>'; + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE OnStart + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Clearing of the result data started.#>'; + END_IF; + END_METHOD + END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index f5e62df6b..948aa13ce 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -14,18 +14,19 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 VAR PRIVATE _infoTime : LTIME := LT#2S; _errorTime : LTIME := LT#5S; + _Status : REF_TO AxoDataman_Status; END_VAR METHOD PUBLIC Run - VAR_IN_OUT - AcquisitionControl : AxoDataman_AcquisitionControl; - AcquisitionStatus : AxoDataman_AcquisitionStatus; - ResultsControl : AxoDataman_ResultsControl; - ResultsStatus : AxoDataman_ResultsStatus; - ResultData : ARRAY[*] OF BYTE; - Config : AxoDataman_Config; - Status : AxoDataman_Status; - Results : AxoDataman_Results; + VAR_INPUT + AcquisitionControl : REF_TO AxoDataman_AcquisitionControl; + AcquisitionStatus : REF_TO AxoDataman_AcquisitionStatus; + ResultsControl : REF_TO AxoDataman_ResultsControl; + ResultsStatus : REF_TO AxoDataman_ResultsStatus; + Config : REF_TO AxoDataman_Config; + Status : REF_TO AxoDataman_Status; + Results : REF_TO AxoDataman_Results; + ResultData : REF_TO ARRAY[*] OF BYTE; END_VAR VAR @@ -47,23 +48,31 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 // _varInfo :=__VARINFO(inoResults); // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); // ELSE - _progress := _progress + 1; + _progress := _progress + 1; + _infoTime := Config^.InfoTime; + _errorTime := Config^.ErrorTime; + _Status := Status; // END_IF; END_IF; IF _progress = 1 THEN - Status.ActionDescription := '<#Reading running.#>'; + Status^.ActionDescription := '<#Reading running.#>'; THIS.CallTimers(FALSE); - _progress := _progress + 1; + IF ResultsStatus^.ErrorDetected THEN + _progress := 20; + ELSE + _progress := _progress + 1; + END_IF; END_IF; + IF _progress = 2 THEN - AcquisitionControl.TriggerEnable := TRUE; - AcquisitionControl.Trigger := FALSE; - ResultsControl.EnableResultBuffering := FALSE; - ResultsControl.ResultsAcknowledge := ResultsStatus.ResultsAvailable; + AcquisitionControl^.TriggerEnable := TRUE; + AcquisitionControl^.Trigger := FALSE; + ResultsControl^.EnableResultBuffering := FALSE; + ResultsControl^.ResultsAcknowledge := ResultsStatus^.ResultsAvailable; // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be reseted!#>').Pin(); - IF NOT ResultsStatus.ResultsAvailable THEN + IF NOT ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -71,16 +80,16 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 3 THEN // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal TriggerReady to be set!#>').Pin(); - IF AcquisitionStatus.TriggerReady THEN + IF AcquisitionStatus^.TriggerReady THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 4 THEN - AcquisitionControl.Trigger := TRUE; + AcquisitionControl^.Trigger := TRUE; // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal TriggerAcknowledge to be set!#>').Pin(); - IF AcquisitionStatus.TriggerAcknowledge THEN + IF AcquisitionStatus^.TriggerAcknowledge THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -88,32 +97,59 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 5 THEN // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be set!#>').Pin(); - IF ResultsStatus.ResultsAvailable THEN + IF ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 6 THEN - THIS.ThrowWhen(Results.Code = UINT#0 OR Results.Length=UINT#0 OR Results.Length > TO_UINT(Status.ResultDataSize)); + THIS.ThrowWhen(Results^.Code = UINT#0 OR Results^.Length=UINT#0 OR Results^.Length > TO_UINT(Status^.ResultDataSize)); THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 7 THEN - System.SerDe.Deserialize(UINT#7, ResultData, Results.Data); - AcquisitionControl.Trigger := FALSE; - ResultsControl.EnableResultBuffering := FALSE; - ResultsControl.ResultsAcknowledge := TRUE; + System.SerDe.Deserialize(UINT#7, ResultData^, Results^.Data); + AcquisitionControl^.Trigger := FALSE; + ResultsControl^.EnableResultBuffering := FALSE; + ResultsControl^.ResultsAcknowledge := TRUE; THIS.DoneWhen(TRUE); _progress := 0; END_IF; + IF _progress = 20 THEN + AcquisitionControl^.TriggerEnable :=FALSE; + AcquisitionControl^.Trigger := FALSE; + ResultsControl^.EnableResultBuffering := FALSE; + ResultsControl^.ResultsAcknowledge := FALSE; + IF NOT AcquisitionStatus^.TriggerReady THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 21 THEN + AcquisitionControl^.TriggerEnable :=TRUE; + IF NOT ResultsStatus^.ErrorDetected THEN + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; + END_IF; + + IF _progress = 22 THEN + AcquisitionControl^.TriggerEnable :=FALSE; + IF _infoTimer.elapsedTime >= T#1s THEN + THIS.CallTimers(FALSE); + _progress := 1; + END_IF; + END_IF; + THIS.CallTimers(TRUE); THIS.ThrowWhen(_errorTimer.output); - Status.SignalStatus.Progress := _progress; + Status^.SignalStatus.Progress := _progress; END_IF; END_METHOD @@ -130,5 +166,30 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _progress := 0; THIS.CallTimers(FALSE); END_METHOD + + METHOD PROTECTED OVERRIDE OnAbort + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Reading was aborted, while not yet completed!#>'; + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE OnDone + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Reading was completed successfully.#>'; + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE OnError + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Reading finished with error.#>'; + END_IF; + END_METHOD + + METHOD PROTECTED OVERRIDE OnStart + IF _Status <> NULL THEN + _Status^.ActionDescription := '<#Reading started.#>'; + END_IF; + END_METHOD + END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index 0f5b3aa64..e4d1eab5a 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -6,6 +6,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ActionDescription : STRING[100]; SignalStatus : AxoDataman_SignalStates; ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; + {#ix-attr:[RenderIgnore()]} UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index 3ef514000..8e960a83a 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -20,14 +20,14 @@ NAMESPACE AxoCognexVisionDatamanExamples END_IF; // Calling the main method `Run` with respective input and output variables. MyDataman.Run( parent := THIS, - AcquisitionControl := PlcOutputs^._10a1_Acquisition_Control_1, - AcquisitionStatus := PlcInputs^._10a1_Acquisition_Status_1, - ResultsControl := PlcOutputs^._10a1_Results_Control_1, - ResultsStatus := PlcInputs^._10a1_Results_Status_1, - SoftEventControl := PlcOutputs^._10a1_Soft_Event_Control_1, - SoftEventStatus := PlcInputs^._10a1_Soft_Event_Control_1, - ResultData := PlcInputs^._10a1_Result_Data_128_bytes_1, - UserData := PlcOutputs^._10a1_User_Data_128_bytes_1); + AcquisitionControl := REF(PlcOutputs^._10a1_Acquisition_Control_1), + AcquisitionStatus := REF(PlcInputs^._10a1_Acquisition_Status_1), + ResultsControl := REF(PlcOutputs^._10a1_Results_Control_1), + ResultsStatus := REF(PlcInputs^._10a1_Results_Status_1), + SoftEventControl := REF(PlcOutputs^._10a1_Soft_Event_Control_1), + SoftEventStatus := REF(PlcInputs^._10a1_Soft_Event_Control_1), + ResultData := REF(PlcInputs^._10a1_Result_Data_128_bytes_1), + UserData := REF(PlcOutputs^._10a1_User_Data_128_bytes_1)); END_METHOD END_CLASS END_NAMESPACE From 54148ed59f69e21ab0bae2e4f386605ca13c5d58 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 28 Jul 2023 22:25:44 +0200 Subject: [PATCH 13/32] some error messages added --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 103 ++++++++++++++---- .../AxoDataman_Status.st | 6 +- 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 0251a57de..4ce86a3dd 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -41,22 +41,22 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[RenderIgnore()]} User : AxoDataman_User; - {#ix-attr:[Container(Layout.Wrap)]} - {#ix-attr:[ComponentDetails("Signal tests")]} - _AcquisitionControl : AxoDataman_AcquisitionControl; - {#ix-attr:[ComponentDetails("Signal tests")]} - _AcquisitionStatus : AxoDataman_AcquisitionStatus; - {#ix-attr:[ComponentDetails("Signal tests")]} - _ResultsControl : AxoDataman_ResultsControl; - {#ix-attr:[ComponentDetails("Signal tests")]} - _ResultsStatus : AxoDataman_ResultsStatus; - END_VAR - - VAR PRIVATE + // {#ix-attr:[Container(Layout.Wrap)]} + // {#ix-attr:[ComponentDetails("Signal tests")]} // _AcquisitionControl : AxoDataman_AcquisitionControl; + // {#ix-attr:[ComponentDetails("Signal tests")]} // _AcquisitionStatus : AxoDataman_AcquisitionStatus; + // {#ix-attr:[ComponentDetails("Signal tests")]} // _ResultsControl : AxoDataman_ResultsControl; + // {#ix-attr:[ComponentDetails("Signal tests")]} // _ResultsStatus : AxoDataman_ResultsStatus; + END_VAR + + VAR PRIVATE + _AcquisitionControl : AxoDataman_AcquisitionControl; + _AcquisitionStatus : AxoDataman_AcquisitionStatus; + _ResultsControl : AxoDataman_ResultsControl; + _ResultsStatus : AxoDataman_ResultsStatus; _SoftEventControl : AxoDataman_SoftEventControl; _SoftEventStatus : AxoDataman_SoftEventStatus; _taskDisabled : BOOL; @@ -114,14 +114,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ; END_METHOD - METHOD PRIVATE UpdateInputs + METHOD PRIVATE UpdateInputs : BOOL VAR_INPUT AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; ResultsStatus : REF_TO BYTE; SoftEventStatus : REF_TO BYTE; ResultData : REF_TO ARRAY[*] OF BYTE; END_VAR - _AcquisitionStatus.TriggerReady := AcquisitionStatus^[0].%X0; _AcquisitionStatus.TriggerAcknowledge := AcquisitionStatus^[0].%X1; _AcquisitionStatus.MissedAcquisition := AcquisitionStatus^[0].%X3; @@ -143,6 +142,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _SoftEventStatus.Reserved06 := SoftEventStatus^.%X6; _SoftEventStatus.SetMatchStringAcknowledge := SoftEventStatus^.%X7; + IF (LOWER_BOUND(ResultData^,1) = 0) THEN IF (UPPER_BOUND(ResultData^,1) = 23) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_16B; @@ -156,8 +156,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; ELSE Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; + Status.ErrorId := UDINT#20; + Status.ErrorDescription := '<#Error: ResultData has invalid size#>.'; + UpdateInputs := FALSE; END_IF; ELSE + Status.ErrorId := UDINT#21; + Status.ErrorDescription := '<#Error: ResultData-lower bound index is not zero.#>.'; + UpdateInputs := FALSE; Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; @@ -170,11 +176,12 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Results.Extended.%B0 := ResultData^[5]; Results.Length.%B1 := ResultData^[6]; Results.Length.%B0 := ResultData^[7]; + UpdateInputs := TRUE; END_IF; END_METHOD - METHOD PRIVATE UpdateOutputs + METHOD PRIVATE UpdateOutputs : BOOL VAR_INPUT AcquisitionControl : REF_TO BYTE; ResultsControl : REF_TO BYTE; @@ -209,20 +216,62 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSIF (UPPER_BOUND(UserData^,1) = 253) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE - Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; + Status.ErrorId := UDINT#22; + Status.ErrorDescription := '<#Error: UserData has invalid size#>.'; + UpdateOutputs := FALSE; END_IF; ELSE - Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; - END_IF; + Status.ErrorId := UDINT#23; + Status.ErrorDescription := '<#Error: UserData-lower bound index is not zero.#>.'; + UpdateOutputs := FALSE; + END_IF; IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN UserData^[0] := User.Option.%B1; UserData^[1] := User.Option.%B0; UserData^[2] := User.Length.%B1; UserData^[3] := User.Length.%B0; + UpdateOutputs := TRUE; END_IF; END_METHOD + METHOD PRIVATE IsValidReferences: BOOL + VAR_INPUT + AcquisitionControl : REF_TO BYTE; + AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + ResultsControl : REF_TO BYTE; + ResultsStatus : REF_TO BYTE; + SoftEventControl : REF_TO BYTE; + SoftEventStatus : REF_TO BYTE; + ResultData : REF_TO ARRAY[*] OF BYTE; + UserData : REF_TO ARRAY[*] OF BYTE; + END_VAR + IsValidReferences := FALSE; + IF AcquisitionControl = NULL THEN + Status.ErrorId := UDINT#11; + Status.ErrorDescription := '<#Error: AcquisitionControl has NULL reference#>.'; + ELSIF AcquisitionStatus = NULL THEN + Status.ErrorId := UDINT#12; + Status.ErrorDescription := '<#Error: AcquisitionStatus has NULL reference#>.'; + ELSIF ResultsControl = NULL THEN + Status.ErrorId := UDINT#13; + Status.ErrorDescription := '<#Error: ResultsControl has NULL reference#>.'; + ELSIF SoftEventControl = NULL THEN + Status.ErrorId := UDINT#14; + Status.ErrorDescription := '<#Error: SoftEventControl has NULL reference#>.'; + ELSIF SoftEventStatus = NULL THEN + Status.ErrorId := UDINT#15; + Status.ErrorDescription := '<#Error: SoftEventStatus has NULL reference#>.'; + ELSIF ResultData = NULL THEN + Status.ErrorId := UDINT#16; + Status.ErrorDescription := '<#Error: ResultData has NULL reference#>.'; + ELSIF UserData = NULL THEN + Status.ErrorId := UDINT#17; + Status.ErrorDescription := '<#Error: UserData has NULL reference#>.'; + ELSE + IsValidReferences := TRUE; + END_IF; + END_METHOD METHOD PROTECTED OVERRIDE Open SUPER.Open(); END_METHOD @@ -239,7 +288,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ResultData : REF_TO ARRAY[*] OF BYTE; UserData : REF_TO ARRAY[*] OF BYTE; END_VAR - + IF parent = NULL THEN + Status.ErrorId := UDINT#10; + Status.ErrorDescription := '<#Error: Parent has NULL reference#>.'; + RETURN; + END_IF; + IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN + RETURN; + END_IF; THIS.Initialize(parent); THIS.Open(); THIS.Execute(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData); @@ -258,7 +314,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ResultData : REF_TO ARRAY[*] OF BYTE; UserData : REF_TO ARRAY[*] OF BYTE; END_VAR - + IF parent = NULL THEN + Status.ErrorId := UDINT#10; + Status.ErrorDescription := '<#Error: Parent has NULL reference#>.'; + RETURN; + END_IF; + IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN + RETURN; + END_IF; THIS.Initialize(parent); THIS.Open(); THIS.Execute(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData); diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index e4d1eab5a..5d27dd6af 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -4,10 +4,12 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 AxoDataman_Status : STRUCT ActionDescription : STRING[100]; + ErrorId : UDINT; + ErrorDescription : STRING[100]; SignalStatus : AxoDataman_SignalStates; - ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; + ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; {#ix-attr:[RenderIgnore()]} - UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; + UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file From 82fde264ecde9b2b2df55d9a6922bb47b8538060 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Tue, 1 Aug 2023 21:24:06 +0200 Subject: [PATCH 14/32] AxoComponent_Status inside components.abstractions --- .../AX_Plc1516V3_CognexDataman.zap18 | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename src/integrations/ctrl/src/Examples/{AXOpen.Cognex.Vision => misc}/AX_Plc1516V3_CognexDataman.zap18 (100%) diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AX_Plc1516V3_CognexDataman.zap18 b/src/integrations/ctrl/src/Examples/misc/AX_Plc1516V3_CognexDataman.zap18 similarity index 100% rename from src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AX_Plc1516V3_CognexDataman.zap18 rename to src/integrations/ctrl/src/Examples/misc/AX_Plc1516V3_CognexDataman.zap18 From 576f66390e211f92a5dfdb5a592722f6931c516f Mon Sep 17 00:00:00 2001 From: TomKovac Date: Tue, 1 Aug 2023 21:25:16 +0200 Subject: [PATCH 15/32] AxoComponent_status inside components.abstractions --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 41 ++-- .../Tasks/AxoDatamanClearResultData.st | 55 ++--- .../v_6_0_0/Tasks/AxoDatamanRead.st | 76 +++---- .../AxoDataman_Status.st | 17 +- .../_AxoDataman_ActionTextList.st | 11 + .../_AxoDataman_ErrorTextList.st | 24 ++ .../AxoDataman/v_6_0_0/AxoDataman.cs | 76 +++++++ .../axopen_cognex_vision_tests.csproj | 213 ++++++++++++++++++ .../ctrl/src/AxoComponent_Status.st | 8 + .../ctrl/src/AxoComponent/AxoComponent.st | 2 +- .../AxoCognexVisionDatamanExample.razor | 31 ++- 11 files changed, 437 insertions(+), 117 deletions(-) create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st create mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st create mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs create mode 100644 src/components.abstractions/ctrl/src/AxoComponent_Status.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 4ce86a3dd..b4b87a95c 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -36,20 +36,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[ReadOnly()]} Status : AxoDataman_Status; - // {#ix-attr:[Container(Layout.Wrap)]} - // {#ix-attr:[ComponentDetails("User data")]} {#ix-attr:[RenderIgnore()]} User : AxoDataman_User; - - // {#ix-attr:[Container(Layout.Wrap)]} - // {#ix-attr:[ComponentDetails("Signal tests")]} - // _AcquisitionControl : AxoDataman_AcquisitionControl; - // {#ix-attr:[ComponentDetails("Signal tests")]} - // _AcquisitionStatus : AxoDataman_AcquisitionStatus; - // {#ix-attr:[ComponentDetails("Signal tests")]} - // _ResultsControl : AxoDataman_ResultsControl; - // {#ix-attr:[ComponentDetails("Signal tests")]} - // _ResultsStatus : AxoDataman_ResultsStatus; END_VAR VAR PRIVATE @@ -102,7 +90,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_FOR; IF NOT _ResultsStatus.ErrorDetected THEN - Status.ActionDescription := '<#Restore executed!#>'; + Status.ActionId := UINT#10; + Status.ActionDescriptionPlc := '<#Restore executed!#>'; _restoreTask.DoneWhen(TRUE); END_IF; END_METHOD @@ -157,12 +146,12 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSE Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; Status.ErrorId := UDINT#20; - Status.ErrorDescription := '<#Error: ResultData has invalid size#>.'; + Status.ErrorDescriptionPlc := '<#Error: ResultData has invalid size!#>'; UpdateInputs := FALSE; END_IF; ELSE Status.ErrorId := UDINT#21; - Status.ErrorDescription := '<#Error: ResultData-lower bound index is not zero.#>.'; + Status.ErrorDescriptionPlc := '<#Error: ResultData-lower bound index is not zero!#>'; UpdateInputs := FALSE; Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; @@ -217,12 +206,12 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE Status.ErrorId := UDINT#22; - Status.ErrorDescription := '<#Error: UserData has invalid size#>.'; + Status.ErrorDescriptionPlc := '<#Error: UserData has invalid size!#>'; UpdateOutputs := FALSE; END_IF; ELSE Status.ErrorId := UDINT#23; - Status.ErrorDescription := '<#Error: UserData-lower bound index is not zero.#>.'; + Status.ErrorDescriptionPlc := '<#Error: UserData-lower bound index is not zero!#>'; UpdateOutputs := FALSE; END_IF; @@ -249,25 +238,25 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IsValidReferences := FALSE; IF AcquisitionControl = NULL THEN Status.ErrorId := UDINT#11; - Status.ErrorDescription := '<#Error: AcquisitionControl has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: AcquisitionControl has NULL reference!#>'; ELSIF AcquisitionStatus = NULL THEN Status.ErrorId := UDINT#12; - Status.ErrorDescription := '<#Error: AcquisitionStatus has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: AcquisitionStatus has NULL reference!#>'; ELSIF ResultsControl = NULL THEN Status.ErrorId := UDINT#13; - Status.ErrorDescription := '<#Error: ResultsControl has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: ResultsControl has NULL reference!#>'; ELSIF SoftEventControl = NULL THEN Status.ErrorId := UDINT#14; - Status.ErrorDescription := '<#Error: SoftEventControl has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: SoftEventControl has NULL reference!#>'; ELSIF SoftEventStatus = NULL THEN Status.ErrorId := UDINT#15; - Status.ErrorDescription := '<#Error: SoftEventStatus has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: SoftEventStatus has NULL reference!#>'; ELSIF ResultData = NULL THEN Status.ErrorId := UDINT#16; - Status.ErrorDescription := '<#Error: ResultData has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: ResultData has NULL reference!#>'; ELSIF UserData = NULL THEN Status.ErrorId := UDINT#17; - Status.ErrorDescription := '<#Error: UserData has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: UserData has NULL reference!#>'; ELSE IsValidReferences := TRUE; END_IF; @@ -290,7 +279,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR IF parent = NULL THEN Status.ErrorId := UDINT#10; - Status.ErrorDescription := '<#Error: Parent has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: Parent has NULL reference!#>'; RETURN; END_IF; IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN @@ -316,7 +305,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR IF parent = NULL THEN Status.ErrorId := UDINT#10; - Status.ErrorDescription := '<#Error: Parent has NULL reference#>.'; + Status.ErrorDescriptionPlc := '<#Error: Parent has NULL reference!#>'; RETURN; END_IF; IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 8b536f531..4a78ca0f9 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -6,9 +6,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _progress : INT := 0; _infoTimer : System.Timer.OnDelay; _errorTimer : System.Timer.OnDelay; - - // _varInfo : __SYSTEM.VAR_INFO; - // _sb : TcoCore.StringBuilder; END_VAR VAR PRIVATE @@ -33,37 +30,18 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _index : INT; END_VAR + _infoTime := Config^.InfoTime; + _errorTime := Config^.ErrorTime; + _Status := Status; IF THIS.Execute() THEN IF _progress = 0 THEN - - // IF NOT __ISVALIDREF(inoIoData) THEN - // _varInfo :=__VARINFO(inoIoData); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSIF NOT __ISVALIDREF(inoConfig) THEN - // _varInfo :=__VARINFO(inoConfig); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSIF NOT __ISVALIDREF(inoStatus) THEN - // _varInfo :=__VARINFO(inoStatus); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSIF NOT __ISVALIDREF(inoResults) THEN - // _varInfo :=__VARINFO(inoResults); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSE - _progress := _progress + 1; - _infoTime := Config^.InfoTime; - _errorTime := Config^.ErrorTime; - _Status := Status; - - // END_IF; - END_IF; - - IF _progress = 1 THEN - Status^.ActionDescription := '<#Clearing of the result data running.#>'; + Status^.ActionId := UINT#11; + Status^.ActionDescriptionPlc := '<#Clearing of the result data running.#>'; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; - IF _progress = 2 THEN + IF _progress = 1 THEN AcquisitionControl^.TriggerEnable := FALSE; AcquisitionControl^.Trigger := FALSE; ResultsControl^.ResultsAcknowledge := TRUE; @@ -77,15 +55,18 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _progress := _progress + 1; END_IF; - IF _progress = 3 THEN - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be reseted!#>').Pin(); + IF _progress = 2 THEN + IF _infoTimer.output THEN + Status^.ErrorId := UDINT#1001; + Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be reseted.#>'; + END_IF; IF NOT ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; - IF _progress = 4 THEN + IF _progress = 3 THEN ResultsControl^.ResultsAcknowledge := FALSE; THIS.DoneWhen(TRUE); THIS.CallTimers(FALSE); @@ -116,25 +97,29 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE OnAbort IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Clearing of the result data was aborted, while not yet completed!#>'; + _Status^.ActionId := UINT#12; + _Status^.ActionDescriptionPlc := '<#Clearing of the result data was aborted, while not yet completed.#>'; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Clearing of the result data was completed successfully.#>'; + _Status^.ActionId := UINT#13; + _Status^.ActionDescriptionPlc := '<#Clearing of the result data was completed successfully.#>'; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Clearing of the result data finished with error.#>'; + _Status^.ActionId := UINT#14; + _Status^.ActionDescriptionPlc := '<#Clearing of the result data finished with error.#>'; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Clearing of the result data started.#>'; + _Status^.ActionId := UINT#15; + _Status^.ActionDescriptionPlc := '<#Clearing of the result data started.#>'; END_IF; END_METHOD diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index 948aa13ce..14473d6dc 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -6,9 +6,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _progress : INT := 0; _infoTimer : System.Timer.OnDelay; _errorTimer : System.Timer.OnDelay; - - // _varInfo : __SYSTEM.VAR_INFO; - // _sb : TcoCore.StringBuilder; END_VAR VAR PRIVATE @@ -33,30 +30,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _index : INT; END_VAR + _infoTime := Config^.InfoTime; + _errorTime := Config^.ErrorTime; + _Status := Status; + IF THIS.Execute() THEN IF _progress = 0 THEN - // IF NOT __ISVALIDREF(inoIoData) THEN - // _varInfo :=__VARINFO(inoIoData); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSIF NOT __ISVALIDREF(inoConfig) THEN - // _varInfo :=__VARINFO(inoConfig); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSIF NOT __ISVALIDREF(inoStatus) THEN - // _varInfo :=__VARINFO(inoStatus); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSIF NOT __ISVALIDREF(inoResults) THEN - // _varInfo :=__VARINFO(inoResults); - // Messenger.Programming(_sb.Clear().Append('<#Invalid reference: #>').Append(_varInfo.Symbol).ToString()).Pin(); - // ELSE - _progress := _progress + 1; - _infoTime := Config^.InfoTime; - _errorTime := Config^.ErrorTime; - _Status := Status; - // END_IF; - END_IF; - - IF _progress = 1 THEN - Status^.ActionDescription := '<#Reading running.#>'; + Status^.ActionId := UINT#16; + Status^.ActionDescriptionPlc := '<#Reading running.#>'; THIS.CallTimers(FALSE); IF ResultsStatus^.ErrorDetected THEN _progress := 20; @@ -64,52 +45,63 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _progress := _progress + 1; END_IF; END_IF; - - IF _progress = 2 THEN + IF _progress = 1 THEN AcquisitionControl^.TriggerEnable := TRUE; AcquisitionControl^.Trigger := FALSE; ResultsControl^.EnableResultBuffering := FALSE; ResultsControl^.ResultsAcknowledge := ResultsStatus^.ResultsAvailable; - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be reseted!#>').Pin(); + IF _infoTimer.output THEN + Status^.ErrorId := UDINT#1001; + Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be reseted!#>'; + END_IF; IF NOT ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; - IF _progress = 3 THEN - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal TriggerReady to be set!#>').Pin(); + IF _progress = 2 THEN + IF _infoTimer.output THEN + Status^.ErrorId := UDINT#1002; + Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerReady to be set!#>'; + END_IF; IF AcquisitionStatus^.TriggerReady THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; - IF _progress = 4 THEN + IF _progress = 3 THEN AcquisitionControl^.Trigger := TRUE; - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal TriggerAcknowledge to be set!#>').Pin(); + IF _infoTimer.output THEN + Status^.ErrorId := UDINT#1003; + Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerAcknowledge to be set!#>'; + END_IF; IF AcquisitionStatus^.TriggerAcknowledge THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; - IF _progress = 5 THEN - // THIS^.Messenger.OnCondition(_infoTimer.Q).Warning('<#Waiting for the signal ResultsAvailable to be set!#>').Pin(); + IF _progress = 4 THEN + IF _infoTimer.output THEN + Status^.ErrorId := UDINT#1004; + Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be set!#>'; + END_IF; IF ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; - IF _progress = 6 THEN + IF _progress = 5 THEN THIS.ThrowWhen(Results^.Code = UINT#0 OR Results^.Length=UINT#0 OR Results^.Length > TO_UINT(Status^.ResultDataSize)); THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; - IF _progress = 7 THEN + IF _progress = 6 THEN System.SerDe.Deserialize(UINT#7, ResultData^, Results^.Data); AcquisitionControl^.Trigger := FALSE; ResultsControl^.EnableResultBuffering := FALSE; @@ -169,25 +161,29 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE OnAbort IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Reading was aborted, while not yet completed!#>'; + _Status^.ActionId := UINT#17; + _Status^.ActionDescriptionPlc := '<#Reading was aborted, while not yet completed.#>'; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Reading was completed successfully.#>'; + _Status^.ActionId := UINT#18; + _Status^.ActionDescriptionPlc := '<#Reading was completed successfully.#>'; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Reading finished with error.#>'; + _Status^.ActionId := UINT#19; + _Status^.ActionDescriptionPlc := '<#Reading finished with error.#>'; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart IF _Status <> NULL THEN - _Status^.ActionDescription := '<#Reading started.#>'; + _Status^.ActionId := UINT#20; + _Status^.ActionDescriptionPlc := '<#Reading started.#>'; END_IF; END_METHOD diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index 5d27dd6af..34ca00ae0 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -1,15 +1,14 @@ +USING AXOpen.Core; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 - TYPE - {#ix-attr:[Container(Layout.Stack)]} - AxoDataman_Status : - STRUCT - ActionDescription : STRING[100]; - ErrorId : UDINT; - ErrorDescription : STRING[100]; + {#ix-attr:[Container(Layout.Stack)]} + CLASS AxoDataman_Status EXTENDS AXOpen.Components.Abstractions.AxoComponent_Status + VAR PUBLIC + ActionDescriptionPlc : STRING[100]; + ErrorDescriptionPlc : STRING[100]; SignalStatus : AxoDataman_SignalStates; ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; {#ix-attr:[RenderIgnore()]} UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; - END_STRUCT; - END_TYPE + END_VAR + END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st new file mode 100644 index 000000000..a87b9b08a --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st @@ -0,0 +1,11 @@ +// Status.ActionId := UINT#10; Status.ActionDescriptionPlc := '<#Restore executed.#>'; +// Status^.ActionId := UINT#11; Status^.ActionDescriptionPlc := '<#Clearing of the result data running.#>'; +// Status^.ActionId := UINT#12; Status^.ActionDescriptionPlc := '<#Clearing of the result data was aborted, while not yet completed!#>'; +// Status^.ActionId := UINT#13; Status^.ActionDescriptionPlc := '<#Clearing of the result data was completed successfully.#>'; +// Status^.ActionId := UINT#14; Status^.ActionDescriptionPlc := '<#Clearing of the result data finished with error!#>'; +// Status^.ActionId := UINT#15; Status^.ActionDescriptionPlc := '<#Clearing of the result data started.#>'; +// Status^.ActionId := UINT#16; Status^.ActionDescriptionPlc := '<#Reading running#>'; +// Status^.ActionId := UINT#17; Status^.ActionDescriptionPlc := '<#Reading was aborted, while not yet completed!#>'; +// Status^.ActionId := UINT#18; Status^.ActionDescriptionPlc := '<#Reading was completed successfully.#>'; +// Status^.ActionId := UINT#19; Status^.ActionDescriptionPlc := '<#Reading finished with error!#>'; +// Status^.ActionId := UINT#20; Status^.ActionDescriptionPlc := '<#Reading started.#>'; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st new file mode 100644 index 000000000..62dd9bef1 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st @@ -0,0 +1,24 @@ +// Status.ErrorId := UDINT#10; Status.ErrorDescriptionPlc := '<#Error: Parent has NULL reference!#>'; +// Status.ErrorId := UDINT#11; Status.ErrorDescriptionPlc := '<#Error: AcquisitionControl has NULL reference!#>'; +// Status.ErrorId := UDINT#12; Status.ErrorDescriptionPlc := '<#Error: AcquisitionStatus has NULL reference!#>'; +// Status.ErrorId := UDINT#13; Status.ErrorDescriptionPlc := '<#Error: ResultsControl has NULL reference!#>'; +// Status.ErrorId := UDINT#14; Status.ErrorDescriptionPlc := '<#Error: SoftEventControl has NULL reference!#>'; +// Status.ErrorId := UDINT#15; Status.ErrorDescriptionPlc := '<#Error: SoftEventStatus has NULL reference!#>'; +// Status.ErrorId := UDINT#16; Status.ErrorDescriptionPlc := '<#Error: ResultData has NULL reference!#>'; +// Status.ErrorId := UDINT#17; Status.ErrorDescriptionPlc := '<#Error: UserData has NULL reference!#>'; +// Status.ErrorId := UDINT#20; Status.ErrorDescriptionPlc := '<#Error: ResultData has invalid size!#>'; +// Status.ErrorId := UDINT#21; Status.ErrorDescriptionPlc := '<#Error: ResultData-lower bound index is not zero!#>'; +// Status.ErrorId := UDINT#22; Status.ErrorDescriptionPlc := '<#Error: UserData has invalid size!#>'; +// Status.ErrorId := UDINT#23; Status.ErrorDescriptionPlc := '<#Error: UserData-lower bound index is not zero!#>'; +// Status^.ErrorId := UDINT#1001; Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be reseted!#>'; +// Status^.ErrorId := UDINT#1002; Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerReady to be set!#>'; +// Status^.ErrorId := UDINT#1003; Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerAcknowledge to be set!#>'; +// Status^.ErrorId := UDINT#1004; Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be set!#>'; + + + + + + + + diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs new file mode 100644 index 000000000..9278e7a75 --- /dev/null +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using AXOpen.Components.Abstractions; +namespace AXOpen.Cognex.Vision.v_6_0_0_0 +{ + public partial class AxoDataman + { + } + + public partial class AxoDataman_Status : AxoComponent_Status + { + Dictionary errorDescriptionDict = new Dictionary(); + Dictionary actionDescriptionDict = new Dictionary(); + + public string ErrorDescription + { + get + { + if(errorDescriptionDict == null) { errorDescriptionDict = new Dictionary(); } + if(errorDescriptionDict.Count == 0) + { + errorDescriptionDict.Add(10 ,"<#Error: Parent has NULL reference#>."); + errorDescriptionDict.Add(11 ,"<#Error: AcquisitionControl has NULL reference#>."); + errorDescriptionDict.Add(12 ,"<#Error: AcquisitionStatus has NULL reference#>."); + errorDescriptionDict.Add(13 ,"<#Error: ResultsControl has NULL reference#>."); + errorDescriptionDict.Add(14 ,"<#Error: SoftEventControl has NULL reference#>."); + errorDescriptionDict.Add(15 ,"<#Error: SoftEventStatus has NULL reference#>."); + errorDescriptionDict.Add(16 ,"<#Error: ResultData has NULL reference#>."); + errorDescriptionDict.Add(17 ,"<#Error: UserData has NULL reference#>."); + errorDescriptionDict.Add(20 ,"<#Error: ResultData has invalid size#>."); + errorDescriptionDict.Add(21 ,"<#Error: ResultData-lower bound index is not zero.#>."); + errorDescriptionDict.Add(22 ,"<#Error: UserData has invalid size#>."); + errorDescriptionDict.Add(23 ,"<#Error: UserData-lower bound index is not zero.#>."); + errorDescriptionDict.Add(1001 ,"<#Waiting for the signal ResultsAvailable to be reseted!#>"); + errorDescriptionDict.Add(1002 ,"<#Waiting for the signal TriggerReady to be set!#>"); + errorDescriptionDict.Add(1003 ,"<#Waiting for the signal TriggerAcknowledge to be set!#>"); + errorDescriptionDict.Add(1004 ,"<#Waiting for the signal ResultsAvailable to be set!#>"); + + } + string errorDescription = ""; + errorDescriptionDict.TryGetValue(ErrorId.LastValue, out errorDescription); + return errorDescription; + } + } + + public string ActionDescription + { + get + { + if (actionDescriptionDict == null) { actionDescriptionDict = new Dictionary(); } + if (actionDescriptionDict.Count == 0) + { + actionDescriptionDict.Add(10, "<#Restore executed.#>"); + actionDescriptionDict.Add(11, "<#Clearing of the result data running.#>"); + actionDescriptionDict.Add(12, "<#Clearing of the result data was aborted, while not yet completed!#>"); + actionDescriptionDict.Add(13, "<#Clearing of the result data was completed successfully.#>"); + actionDescriptionDict.Add(14, "<#Clearing of the result data finished with error!#>"); + actionDescriptionDict.Add(15, "<#Clearing of the result data started.#>"); + actionDescriptionDict.Add(16, "<#Reading running.#>"); + actionDescriptionDict.Add(17, "<#Reading was aborted, while not yet completed!#>"); + actionDescriptionDict.Add(18, "<#Reading was completed successfully.#>"); + actionDescriptionDict.Add(19, "<#Reading finished with error!#>"); + actionDescriptionDict.Add(20, "<#Reading started.#>"); + + } + string actionDescription = ""; + actionDescriptionDict.TryGetValue(ErrorId.LastValue, out actionDescription); + return actionDescription; + } + } + } +} diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj index aa6dfebfb..abb040de7 100644 --- a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj +++ b/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj @@ -6,6 +6,219 @@ false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components.abstractions/ctrl/src/AxoComponent_Status.st b/src/components.abstractions/ctrl/src/AxoComponent_Status.st new file mode 100644 index 000000000..f7ff6c4b6 --- /dev/null +++ b/src/components.abstractions/ctrl/src/AxoComponent_Status.st @@ -0,0 +1,8 @@ +NAMESPACE AXOpen.Components.Abstractions + CLASS PUBLIC AxoComponent_Status + VAR PUBLIC + ActionId : UDINT; + ErrorId : UDINT; + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/core/ctrl/src/AxoComponent/AxoComponent.st b/src/core/ctrl/src/AxoComponent/AxoComponent.st index 95ae5ea73..25ad0427c 100644 --- a/src/core/ctrl/src/AxoComponent/AxoComponent.st +++ b/src/core/ctrl/src/AxoComponent/AxoComponent.st @@ -40,7 +40,7 @@ NAMESPACE AXOpen.Core END_VAR VAR PUBLIC - {attribute addProperty Name "<#Is manually controllable#>"} + {#ix-set:AttributeName = "<#Is manually controllable#>"} {attribute clr [ReadOnly()]} _isManuallyControllable : BOOL; END_VAR diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor index cb9a8f7c7..e990688c9 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor @@ -11,17 +11,36 @@
    -
    - -
    -
    +
    + +
    +
    +
    + +
    +
    + ActionDescription: +

    + Text: @TextValue +

    + + @code { + string TextValue = @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ActionDescription.ToString(); + } + @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ActionDescription +
    +
    + ErrorDescription: + @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ErrorDescription +
    + +
    - +
    -
    From 62f3be9e950528a5c96dd01428821ece4c98ceca Mon Sep 17 00:00:00 2001 From: TomKovac Date: Wed, 2 Aug 2023 18:33:55 +0200 Subject: [PATCH 16/32] AxoTextList added --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 69 ++++++++------- .../Tasks/AxoDatamanClearResultData.st | 26 +++--- .../v_6_0_0/Tasks/AxoDatamanRead.st | 39 ++++----- .../AxoDataman_Config.st | 2 - .../AxoDataman_Results.st | 8 +- .../AxoDataman_SignalStates.st | 3 - .../AxoDataman_Status.st | 4 +- .../_AxoDataman_ActionTextList.st | 11 --- .../_AxoDataman_ErrorTextList.st | 24 ----- .../AxoDataman/v_6_0_0/AxoDataman.cs | 87 ++++++++++++------- .../ctrl/src/AxoComponent_Status.st | 15 +++- .../ctrl/src/AxoDictionaryIdentifier.st | 7 ++ .../AxoDictionaryIdentifierView.razor | 11 +++ .../AxoDictionaryIdentifierView.razor.cs | 50 +++++++++++ ...open_components_abstractions_blazor.csproj | 8 +- .../AxoDictionaryIdentifier.cs | 15 ++++ ...x_ax_axopen_components_abstractions.csproj | 2 +- src/core/ctrl/src/AxoTextList/AxoTextList.st | 7 ++ .../AxoTextList/AxoTextListView.razor | 11 +++ .../AxoTextList/AxoTextListView.razor.cs | 50 +++++++++++ .../AXOpen.Core/AxoTextList/AxoTextList.cs | 15 ++++ .../AxoTextList/AxoTextListExample.st | 33 +++++++ src/integrations/ctrl/src/configuration.st | 1 + src/integrations/ctrl/src/program.st | 3 + .../AxoCognexVisionDatamanExample.razor | 17 +--- .../AxoTextList/AxoTextListExample.razor | 25 ++++++ .../Shared/NavMenu.razor | 5 ++ .../AxoTextListExampleContext.cs | 36 ++++++++ 28 files changed, 413 insertions(+), 171 deletions(-) delete mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st delete mode 100644 src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st create mode 100644 src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs create mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs create mode 100644 src/core/ctrl/src/AxoTextList/AxoTextList.st create mode 100644 src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor create mode 100644 src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs create mode 100644 src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs create mode 100644 src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st create mode 100644 src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor create mode 100644 src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index b4b87a95c..33df4ed33 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -20,9 +20,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-set:AttributeName = "<#Restore#>"} _restoreTask : AXOpen.Core.AxoTask; {#ix-attr:[ComponentDetails("Tasks")]} - {#ix-set:AttributeName = "<#Update signal states#>"} - _updateSignalStatesTask : AXOpen.Core.AxoTask; - {#ix-attr:[ComponentDetails("Tasks")]} {#ix-set:AttributeName = "<#Clear result data#>"} _clearResultDataTask : AxoDatamanClearResultData; @@ -33,10 +30,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Update#>"} + _updateSignalStatesTask : AXOpen.Core.AxoTask; + {#ix-attr:[ComponentDetails("Status")]} {#ix-attr:[ReadOnly()]} Status : AxoDataman_Status; - {#ix-attr:[RenderIgnore()]} + {#ix-attr:[CompilerOmits()]} User : AxoDataman_User; END_VAR @@ -57,6 +57,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 VAR _index : INT; END_VAR + Status.ActionId := UINT#0; + Status.ErrorId := UINT#0; + + Status.Action.Id := UINT#0; + Status.Error.Id := UINT#0; _updateSignalStatesTask.Restore(); _clearResultDataTask.Restore(); @@ -90,8 +95,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_FOR; IF NOT _ResultsStatus.ErrorDetected THEN - Status.ActionId := UINT#10; - Status.ActionDescriptionPlc := '<#Restore executed!#>'; + Status.ActionId := UINT#300; + Status.Action.Id := UINT#300; _restoreTask.DoneWhen(TRUE); END_IF; END_METHOD @@ -145,13 +150,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; ELSE Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; - Status.ErrorId := UDINT#20; - Status.ErrorDescriptionPlc := '<#Error: ResultData has invalid size!#>'; + Status.ErrorId := UINT#708; + Status.Error.Id := UINT#708; UpdateInputs := FALSE; END_IF; ELSE - Status.ErrorId := UDINT#21; - Status.ErrorDescriptionPlc := '<#Error: ResultData-lower bound index is not zero!#>'; + Status.ErrorId := UINT#709; + Status.Error.Id := UINT#709; UpdateInputs := FALSE; Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; @@ -205,13 +210,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSIF (UPPER_BOUND(UserData^,1) = 253) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE - Status.ErrorId := UDINT#22; - Status.ErrorDescriptionPlc := '<#Error: UserData has invalid size!#>'; + Status.ErrorId := UINT#710; + Status.Error.Id := UINT#710; UpdateOutputs := FALSE; END_IF; ELSE - Status.ErrorId := UDINT#23; - Status.ErrorDescriptionPlc := '<#Error: UserData-lower bound index is not zero!#>'; + Status.ErrorId := UINT#711; + Status.Error.Id := UINT#711; UpdateOutputs := FALSE; END_IF; @@ -237,26 +242,26 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR IsValidReferences := FALSE; IF AcquisitionControl = NULL THEN - Status.ErrorId := UDINT#11; - Status.ErrorDescriptionPlc := '<#Error: AcquisitionControl has NULL reference!#>'; + Status.ErrorId := UINT#701; + Status.Error.Id := UINT#701; ELSIF AcquisitionStatus = NULL THEN - Status.ErrorId := UDINT#12; - Status.ErrorDescriptionPlc := '<#Error: AcquisitionStatus has NULL reference!#>'; + Status.ErrorId := UINT#702; + Status.Error.Id := UINT#702; ELSIF ResultsControl = NULL THEN - Status.ErrorId := UDINT#13; - Status.ErrorDescriptionPlc := '<#Error: ResultsControl has NULL reference!#>'; + Status.ErrorId := UINT#703; + Status.Error.Id := UINT#703; ELSIF SoftEventControl = NULL THEN - Status.ErrorId := UDINT#14; - Status.ErrorDescriptionPlc := '<#Error: SoftEventControl has NULL reference!#>'; + Status.Error.Id := UINT#704; + Status.ErrorId := UINT#704; ELSIF SoftEventStatus = NULL THEN - Status.ErrorId := UDINT#15; - Status.ErrorDescriptionPlc := '<#Error: SoftEventStatus has NULL reference!#>'; + Status.ErrorId := UINT#705; + Status.Error.Id := UINT#705; ELSIF ResultData = NULL THEN - Status.ErrorId := UDINT#16; - Status.ErrorDescriptionPlc := '<#Error: ResultData has NULL reference!#>'; + Status.ErrorId := UINT#706; + Status.Error.Id := UINT#706; ELSIF UserData = NULL THEN - Status.ErrorId := UDINT#17; - Status.ErrorDescriptionPlc := '<#Error: UserData has NULL reference!#>'; + Status.ErrorId := UINT#707; + Status.Error.Id := UINT#707; ELSE IsValidReferences := TRUE; END_IF; @@ -278,8 +283,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 UserData : REF_TO ARRAY[*] OF BYTE; END_VAR IF parent = NULL THEN - Status.ErrorId := UDINT#10; - Status.ErrorDescriptionPlc := '<#Error: Parent has NULL reference!#>'; + Status.ErrorId := UINT#700; + Status.Error.Id := UINT#700; RETURN; END_IF; IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN @@ -304,8 +309,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 UserData : REF_TO ARRAY[*] OF BYTE; END_VAR IF parent = NULL THEN - Status.ErrorId := UDINT#10; - Status.ErrorDescriptionPlc := '<#Error: Parent has NULL reference!#>'; + Status.ErrorId := UINT#700; + Status.Error.Id := UINT#700; RETURN; END_IF; IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 4a78ca0f9..e54fbcc86 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -35,8 +35,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _Status := Status; IF THIS.Execute() THEN IF _progress = 0 THEN - Status^.ActionId := UINT#11; - Status^.ActionDescriptionPlc := '<#Clearing of the result data running.#>'; + Status^.ActionId := UINT#302; + Status^.Action.Id := UINT#302; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -57,8 +57,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 2 THEN IF _infoTimer.output THEN - Status^.ErrorId := UDINT#1001; - Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be reseted.#>'; + Status^.ErrorId := UINT#600; + Status^.Error.Id := UINT#600; END_IF; IF NOT ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); @@ -76,7 +76,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.CallTimers(TRUE); THIS.ThrowWhen(_errorTimer.output); - Status^.SignalStatus.Progress := _progress; END_IF; END_METHOD @@ -97,31 +96,30 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE OnAbort IF _Status <> NULL THEN - _Status^.ActionId := UINT#12; - _Status^.ActionDescriptionPlc := '<#Clearing of the result data was aborted, while not yet completed.#>'; + _Status^.ActionId := UINT#600; + _Status^.Action.Id := UINT#600; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone IF _Status <> NULL THEN - _Status^.ActionId := UINT#13; - _Status^.ActionDescriptionPlc := '<#Clearing of the result data was completed successfully.#>'; + _Status^.ActionId := UINT#303; + _Status^.Action.Id := UINT#303; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError IF _Status <> NULL THEN - _Status^.ActionId := UINT#14; - _Status^.ActionDescriptionPlc := '<#Clearing of the result data finished with error.#>'; + _Status^.ActionId := UINT#700; + _Status^.Action.Id := UINT#700; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart IF _Status <> NULL THEN - _Status^.ActionId := UINT#15; - _Status^.ActionDescriptionPlc := '<#Clearing of the result data started.#>'; + _Status^.ActionId := UINT#301; + _Status^.Action.Id := UINT#301; END_IF; END_METHOD - END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index 14473d6dc..d634d4ffb 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -36,8 +36,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF THIS.Execute() THEN IF _progress = 0 THEN - Status^.ActionId := UINT#16; - Status^.ActionDescriptionPlc := '<#Reading running.#>'; + Status^.ActionId := UINT#305; + Status^.Action.Id := UINT#305; THIS.CallTimers(FALSE); IF ResultsStatus^.ErrorDetected THEN _progress := 20; @@ -52,8 +52,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ResultsControl^.EnableResultBuffering := FALSE; ResultsControl^.ResultsAcknowledge := ResultsStatus^.ResultsAvailable; IF _infoTimer.output THEN - Status^.ErrorId := UDINT#1001; - Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be reseted!#>'; + Status^.ErrorId := UINT#600; + Status^.Error.Id := UINT#600; END_IF; IF NOT ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); @@ -63,8 +63,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 2 THEN IF _infoTimer.output THEN - Status^.ErrorId := UDINT#1002; - Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerReady to be set!#>'; + Status^.ErrorId := UINT#601; + Status^.Error.Id := UINT#601; END_IF; IF AcquisitionStatus^.TriggerReady THEN THIS.CallTimers(FALSE); @@ -75,8 +75,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 3 THEN AcquisitionControl^.Trigger := TRUE; IF _infoTimer.output THEN - Status^.ErrorId := UDINT#1003; - Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerAcknowledge to be set!#>'; + Status^.ErrorId := UINT#602; + Status^.Error.Id := UINT#602; END_IF; IF AcquisitionStatus^.TriggerAcknowledge THEN THIS.CallTimers(FALSE); @@ -86,8 +86,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 4 THEN IF _infoTimer.output THEN - Status^.ErrorId := UDINT#1004; - Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be set!#>'; + Status^.ErrorId := UINT#603; + Status^.Error.Id := UINT#603; END_IF; IF ResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); @@ -140,8 +140,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.CallTimers(TRUE); THIS.ThrowWhen(_errorTimer.output); - - Status^.SignalStatus.Progress := _progress; END_IF; END_METHOD @@ -161,31 +159,30 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE OnAbort IF _Status <> NULL THEN - _Status^.ActionId := UINT#17; - _Status^.ActionDescriptionPlc := '<#Reading was aborted, while not yet completed.#>'; + _Status^.ActionId := UINT#601; + _Status^.Action.Id := UINT#601; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone IF _Status <> NULL THEN - _Status^.ActionId := UINT#18; - _Status^.ActionDescriptionPlc := '<#Reading was completed successfully.#>'; + _Status^.ActionId := UINT#306; + _Status^.Action.Id := UINT#306; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError IF _Status <> NULL THEN - _Status^.ActionId := UINT#19; - _Status^.ActionDescriptionPlc := '<#Reading finished with error.#>'; + _Status^.ActionId := UINT#701; + _Status^.Action.Id := UINT#701; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart IF _Status <> NULL THEN - _Status^.ActionId := UINT#20; - _Status^.ActionDescriptionPlc := '<#Reading started.#>'; + _Status^.ActionId := UINT#304; + _Status^.Action.Id := UINT#304; END_IF; END_METHOD - END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st index fa152e4e0..65bdcbeea 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st @@ -1,5 +1,3 @@ -USING System.SerDe; - NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE {#ix-attr:[Container(Layout.Stack)]} diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st index ae492f8b9..2f0ce7ff7 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st @@ -2,13 +2,13 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_Results : STRUCT - {#ix-attr:[RenderIgnore()]} + {#ix-attr:[CompilerOmits()]} Id: UINT; - {#ix-attr:[RenderIgnore()]} + {#ix-attr:[CompilerOmits()]} Code: UINT; - {#ix-attr:[RenderIgnore()]} + {#ix-attr:[CompilerOmits()]} Extended: UINT; - {#ix-attr:[RenderIgnore()]} + {#ix-attr:[CompilerOmits()]} Length : UINT; Data : STRING[246]; END_STRUCT; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st index 991d5710b..d8da1286a 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st @@ -44,9 +44,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ResultExtended : UINT; {#ix-set:AttributeName = "<#Result length#>"} ResultLength : UINT; - - {#ix-set:AttributeName = "<#Progress: just for debugging#>"} - Progress : INT; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index 34ca00ae0..fe5aad461 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -3,11 +3,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Stack)]} CLASS AxoDataman_Status EXTENDS AXOpen.Components.Abstractions.AxoComponent_Status VAR PUBLIC - ActionDescriptionPlc : STRING[100]; - ErrorDescriptionPlc : STRING[100]; SignalStatus : AxoDataman_SignalStates; ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; - {#ix-attr:[RenderIgnore()]} + {#ix-attr:[CompilerOmits()]} UserDataSize : eAxoDataman_UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; END_VAR END_CLASS diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st deleted file mode 100644 index a87b9b08a..000000000 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ActionTextList.st +++ /dev/null @@ -1,11 +0,0 @@ -// Status.ActionId := UINT#10; Status.ActionDescriptionPlc := '<#Restore executed.#>'; -// Status^.ActionId := UINT#11; Status^.ActionDescriptionPlc := '<#Clearing of the result data running.#>'; -// Status^.ActionId := UINT#12; Status^.ActionDescriptionPlc := '<#Clearing of the result data was aborted, while not yet completed!#>'; -// Status^.ActionId := UINT#13; Status^.ActionDescriptionPlc := '<#Clearing of the result data was completed successfully.#>'; -// Status^.ActionId := UINT#14; Status^.ActionDescriptionPlc := '<#Clearing of the result data finished with error!#>'; -// Status^.ActionId := UINT#15; Status^.ActionDescriptionPlc := '<#Clearing of the result data started.#>'; -// Status^.ActionId := UINT#16; Status^.ActionDescriptionPlc := '<#Reading running#>'; -// Status^.ActionId := UINT#17; Status^.ActionDescriptionPlc := '<#Reading was aborted, while not yet completed!#>'; -// Status^.ActionId := UINT#18; Status^.ActionDescriptionPlc := '<#Reading was completed successfully.#>'; -// Status^.ActionId := UINT#19; Status^.ActionDescriptionPlc := '<#Reading finished with error!#>'; -// Status^.ActionId := UINT#20; Status^.ActionDescriptionPlc := '<#Reading started.#>'; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st deleted file mode 100644 index 62dd9bef1..000000000 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/_AxoDataman_ErrorTextList.st +++ /dev/null @@ -1,24 +0,0 @@ -// Status.ErrorId := UDINT#10; Status.ErrorDescriptionPlc := '<#Error: Parent has NULL reference!#>'; -// Status.ErrorId := UDINT#11; Status.ErrorDescriptionPlc := '<#Error: AcquisitionControl has NULL reference!#>'; -// Status.ErrorId := UDINT#12; Status.ErrorDescriptionPlc := '<#Error: AcquisitionStatus has NULL reference!#>'; -// Status.ErrorId := UDINT#13; Status.ErrorDescriptionPlc := '<#Error: ResultsControl has NULL reference!#>'; -// Status.ErrorId := UDINT#14; Status.ErrorDescriptionPlc := '<#Error: SoftEventControl has NULL reference!#>'; -// Status.ErrorId := UDINT#15; Status.ErrorDescriptionPlc := '<#Error: SoftEventStatus has NULL reference!#>'; -// Status.ErrorId := UDINT#16; Status.ErrorDescriptionPlc := '<#Error: ResultData has NULL reference!#>'; -// Status.ErrorId := UDINT#17; Status.ErrorDescriptionPlc := '<#Error: UserData has NULL reference!#>'; -// Status.ErrorId := UDINT#20; Status.ErrorDescriptionPlc := '<#Error: ResultData has invalid size!#>'; -// Status.ErrorId := UDINT#21; Status.ErrorDescriptionPlc := '<#Error: ResultData-lower bound index is not zero!#>'; -// Status.ErrorId := UDINT#22; Status.ErrorDescriptionPlc := '<#Error: UserData has invalid size!#>'; -// Status.ErrorId := UDINT#23; Status.ErrorDescriptionPlc := '<#Error: UserData-lower bound index is not zero!#>'; -// Status^.ErrorId := UDINT#1001; Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be reseted!#>'; -// Status^.ErrorId := UDINT#1002; Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerReady to be set!#>'; -// Status^.ErrorId := UDINT#1003; Status^.ErrorDescriptionPlc := '<#Waiting for the signal TriggerAcknowledge to be set!#>'; -// Status^.ErrorId := UDINT#1004; Status^.ErrorDescriptionPlc := '<#Waiting for the signal ResultsAvailable to be set!#>'; - - - - - - - - diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index 9278e7a75..32b6438f9 100644 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -23,27 +23,37 @@ public string ErrorDescription if(errorDescriptionDict == null) { errorDescriptionDict = new Dictionary(); } if(errorDescriptionDict.Count == 0) { - errorDescriptionDict.Add(10 ,"<#Error: Parent has NULL reference#>."); - errorDescriptionDict.Add(11 ,"<#Error: AcquisitionControl has NULL reference#>."); - errorDescriptionDict.Add(12 ,"<#Error: AcquisitionStatus has NULL reference#>."); - errorDescriptionDict.Add(13 ,"<#Error: ResultsControl has NULL reference#>."); - errorDescriptionDict.Add(14 ,"<#Error: SoftEventControl has NULL reference#>."); - errorDescriptionDict.Add(15 ,"<#Error: SoftEventStatus has NULL reference#>."); - errorDescriptionDict.Add(16 ,"<#Error: ResultData has NULL reference#>."); - errorDescriptionDict.Add(17 ,"<#Error: UserData has NULL reference#>."); - errorDescriptionDict.Add(20 ,"<#Error: ResultData has invalid size#>."); - errorDescriptionDict.Add(21 ,"<#Error: ResultData-lower bound index is not zero.#>."); - errorDescriptionDict.Add(22 ,"<#Error: UserData has invalid size#>."); - errorDescriptionDict.Add(23 ,"<#Error: UserData-lower bound index is not zero.#>."); - errorDescriptionDict.Add(1001 ,"<#Waiting for the signal ResultsAvailable to be reseted!#>"); - errorDescriptionDict.Add(1002 ,"<#Waiting for the signal TriggerReady to be set!#>"); - errorDescriptionDict.Add(1003 ,"<#Waiting for the signal TriggerAcknowledge to be set!#>"); - errorDescriptionDict.Add(1004 ,"<#Waiting for the signal ResultsAvailable to be set!#>"); + errorDescriptionDict.Add(0 , " "); + errorDescriptionDict.Add(600, "<#Waiting for the signal ResultsAvailable to be reseted!#>"); + errorDescriptionDict.Add(601, "<#Waiting for the signal TriggerReady to be set!#>"); + errorDescriptionDict.Add(602, "<#Waiting for the signal TriggerAcknowledge to be set!#>"); + errorDescriptionDict.Add(603, "<#Waiting for the signal ResultsAvailable to be set!#>"); + + errorDescriptionDict.Add(700 ,"<#Error: Parent has NULL reference!#>"); + errorDescriptionDict.Add(701 ,"<#Error: AcquisitionControl has NULL reference!#>"); + errorDescriptionDict.Add(702 ,"<#Error: AcquisitionStatus has NULL reference!#>"); + errorDescriptionDict.Add(703 ,"<#Error: ResultsControl has NULL reference!#>"); + errorDescriptionDict.Add(704 ,"<#Error: SoftEventControl has NULL reference!#>"); + errorDescriptionDict.Add(705 ,"<#Error: SoftEventStatus has NULL reference!#>"); + errorDescriptionDict.Add(706 ,"<#Error: ResultData has NULL reference!#>"); + errorDescriptionDict.Add(707 ,"<#Error: UserData has NULL reference!#>"); + errorDescriptionDict.Add(708 ,"<#Error: ResultData has invalid size!#>"); + errorDescriptionDict.Add(709 ,"<#Error: ResultData-lower bound index is not zero!#>"); + errorDescriptionDict.Add(710 ,"<#Error: UserData has invalid size!#>"); + errorDescriptionDict.Add(711 ,"<#Error: UserData-lower bound index is not zero!#>"); + + } + string errorDescription = " "; + if (errorDescriptionDict.TryGetValue(ErrorId.LastValue, out errorDescription)) + { + return errorDescription; + } + else + + { + return " "; } - string errorDescription = ""; - errorDescriptionDict.TryGetValue(ErrorId.LastValue, out errorDescription); - return errorDescription; } } @@ -54,22 +64,33 @@ public string ActionDescription if (actionDescriptionDict == null) { actionDescriptionDict = new Dictionary(); } if (actionDescriptionDict.Count == 0) { - actionDescriptionDict.Add(10, "<#Restore executed.#>"); - actionDescriptionDict.Add(11, "<#Clearing of the result data running.#>"); - actionDescriptionDict.Add(12, "<#Clearing of the result data was aborted, while not yet completed!#>"); - actionDescriptionDict.Add(13, "<#Clearing of the result data was completed successfully.#>"); - actionDescriptionDict.Add(14, "<#Clearing of the result data finished with error!#>"); - actionDescriptionDict.Add(15, "<#Clearing of the result data started.#>"); - actionDescriptionDict.Add(16, "<#Reading running.#>"); - actionDescriptionDict.Add(17, "<#Reading was aborted, while not yet completed!#>"); - actionDescriptionDict.Add(18, "<#Reading was completed successfully.#>"); - actionDescriptionDict.Add(19, "<#Reading finished with error!#>"); - actionDescriptionDict.Add(20, "<#Reading started.#>"); + actionDescriptionDict.Add(0 ," "); + actionDescriptionDict.Add(300 ,"<#Restore executed.#>"); + actionDescriptionDict.Add(301 ,"<#Clearing of the result data started.#>"); + actionDescriptionDict.Add(302 ,"<#Clearing of the result data running.#>"); + actionDescriptionDict.Add(303 ,"<#Clearing of the result data was completed successfully.#>"); + actionDescriptionDict.Add(304 ,"<#Reading started.#>"); + actionDescriptionDict.Add(305 ,"<#Reading running.#>"); + actionDescriptionDict.Add(306 ,"<#Reading was completed successfully.#>"); + + actionDescriptionDict.Add(600 ,"<#Clearing of the result data was aborted, while not yet completed!#>"); + actionDescriptionDict.Add(601 ,"<#Reading was aborted, while not yet completed!#>"); + + actionDescriptionDict.Add(700 ,"<#Clearing of the result data finished with error!#>"); + actionDescriptionDict.Add(701 ,"<#Reading finished with error!#>"); + + } + string actionDescription = " "; + if(actionDescriptionDict.TryGetValue(ActionId.LastValue, out actionDescription)) + { + return actionDescription; + } + else + { + return " "; } - string actionDescription = ""; - actionDescriptionDict.TryGetValue(ErrorId.LastValue, out actionDescription); - return actionDescription; + } } } diff --git a/src/components.abstractions/ctrl/src/AxoComponent_Status.st b/src/components.abstractions/ctrl/src/AxoComponent_Status.st index f7ff6c4b6..ed6aff465 100644 --- a/src/components.abstractions/ctrl/src/AxoComponent_Status.st +++ b/src/components.abstractions/ctrl/src/AxoComponent_Status.st @@ -1,8 +1,15 @@ -NAMESPACE AXOpen.Components.Abstractions +NAMESPACE AXOpen.Components.Abstractions CLASS PUBLIC AxoComponent_Status - VAR PUBLIC - ActionId : UDINT; - ErrorId : UDINT; + VAR PUBLIC + {#ix-set:AttributeName = "ActionDescription |[[1]ActionDescription]|"} + ActionId : UINT; + {#ix-set:AttributeName = "ErrorDescription |[[1]ErrorDescription]|"} + ErrorId : UINT; + + {#ix-set:AttributeName = "ActionDescription |[[1]ActionDescription]|"} + Action : AxoDictionaryIdentifier; + {#ix-set:AttributeName = "ErrorDescription |[[1]ErrorDescription]|"} + Error : AxoDictionaryIdentifier; END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st b/src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st new file mode 100644 index 000000000..48f37a45b --- /dev/null +++ b/src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st @@ -0,0 +1,7 @@ +NAMESPACE AXOpen.Components.Abstractions + TYPE AxoDictionaryIdentifier : + STRUCT + Id : UINT; + END_STRUCT; + END_TYPE +END_NAMESPACE \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor new file mode 100644 index 000000000..8e95b86cb --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor @@ -0,0 +1,11 @@ +@namespace AXOpen.Components.Abstractions +@using AXSharp.Connector; +@using Microsoft.AspNetCore.Components.Authorization +@inherits RenderableComplexComponentBase +@implements IDisposable; + +
    +
    + @Description +
    +
    \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs new file mode 100644 index 000000000..90b6f8c40 --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs @@ -0,0 +1,50 @@ +using System.Net.Http.Headers; +using System.Security.Principal; +using AXSharp.Connector; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace AXOpen.Components.Abstractions +{ + public partial class AxoDictionaryIdentifierView : IDisposable + { + protected override void OnInitialized() + { + base.OnInitialized(); + UpdateValuesOnChange(Component); + } + + public string Description => Component.AttributeName; + } + + public class AxoDictionaryIdentifierCommandView : AxoDictionaryIdentifierView + { + public AxoDictionaryIdentifierCommandView() + { + ; + } + } + + public class AxoDictionaryIdentifierControlView : AxoDictionaryIdentifierView + { + public AxoDictionaryIdentifierControlView() + { + ; + } + } + + public class AxoDictionaryIdentifierStatusView : AxoDictionaryIdentifierView + { + public AxoDictionaryIdentifierStatusView() + { + ; + } + } + public class AxoDictionaryIdentifierDisplayView : AxoDictionaryIdentifierView + { + public AxoDictionaryIdentifierDisplayView() + { + ; + } + } +} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj index 239acfdbf..5171c6954 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj @@ -4,14 +4,10 @@ net7.0 enable enable - AXOpen.Core.Blazor - AXOpen.Core.Blazor + AXOpen.Components.Abstractions.Blazor + AXOpen.Components.Abstractions.Blazor - - - - diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs new file mode 100644 index 000000000..3a53ad50e --- /dev/null +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs @@ -0,0 +1,15 @@ +using System; +using AXSharp.Connector; +using AXSharp.Connector.ValueTypes; +using System.Collections.Generic; +using AXOpen; +using System.ComponentModel; +using System.Security.Principal; + +namespace AXOpen.Components.Abstraction +{ + public partial class AxoDictionaryIdentifier + { + + } +} \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj index 6e899e4ae..947027c84 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj @@ -1,4 +1,4 @@ - + net7.0 enable diff --git a/src/core/ctrl/src/AxoTextList/AxoTextList.st b/src/core/ctrl/src/AxoTextList/AxoTextList.st new file mode 100644 index 000000000..8a8fc393e --- /dev/null +++ b/src/core/ctrl/src/AxoTextList/AxoTextList.st @@ -0,0 +1,7 @@ +NAMESPACE AXOpen.Core + CLASS PUBLIC AxoTextList + VAR PUBLIC + Id : UINT; + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor new file mode 100644 index 000000000..9dce6d9ea --- /dev/null +++ b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor @@ -0,0 +1,11 @@ +@namespace AXOpen.Core +@using AXSharp.Connector; +@using Microsoft.AspNetCore.Components.Authorization +@inherits RenderableComplexComponentBase +@implements IDisposable; + +
    +
    + @_text +
    +
    \ No newline at end of file diff --git a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs new file mode 100644 index 000000000..62a318411 --- /dev/null +++ b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs @@ -0,0 +1,50 @@ +using System.Net.Http.Headers; +using System.Security.Principal; +using AXSharp.Connector; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; + +namespace AXOpen.Core +{ + public partial class AxoTextListView : IDisposable + { + + + private string _btnClass + { + get + { + if (Component.Id.Cyclic < (int)AXOpen.Messaging.eAxoMessageCategory.Warning) + return "btn-info"; + else if(Component.Id.Cyclic >= (int)AXOpen.Messaging.eAxoMessageCategory.Error) + return "btn-danger"; + else + return "btn-warning"; + } + } + + protected override void OnInitialized() + { + base.OnInitialized(); + UpdateValuesOnChange(Component); + } + + private string _text => string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; + + + } + + public class AxoTextListCommandView : AxoTextListView + { + public AxoTextListCommandView() + { + } + } + + public class AxoTextListStatusView : AxoTextListView + { + public AxoTextListStatusView() + { + } + } +} diff --git a/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs b/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs new file mode 100644 index 000000000..c4f5915b1 --- /dev/null +++ b/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs @@ -0,0 +1,15 @@ +using System; +using AXSharp.Connector; +using AXSharp.Connector.ValueTypes; +using System.Collections.Generic; +using AXOpen; +using System.ComponentModel; +using System.Security.Principal; + +namespace AXOpen.Core +{ + public partial class AxoTextList + { + + } +} \ No newline at end of file diff --git a/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st b/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st new file mode 100644 index 000000000..f6ec6189c --- /dev/null +++ b/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st @@ -0,0 +1,33 @@ +USING AXOpen.Core; + +NAMESPACE AxoTextListExample + + + CLASS AxoTextListExampleContext EXTENDS AXOpen.Core.AxoContext + VAR PUBLIC + {#ix-set:AttributeName = "Click to increment text list Id"} + _incrementTask : AXOpen.Core.AxoTask; + {#ix-set:AttributeName = "Click to reset text list Id to zero"} + _set2zeroTask : AXOpen.Core.AxoTask; + + {#ix-set:AttributeName = "Description: |[[1]Description]|"} + _myTextList : AXOpen.Core.AxoTextList; + END_VAR + + METHOD PROTECTED OVERRIDE Main + _incrementTask.Initialize(THIS); + _set2zeroTask.Initialize(THIS); + + IF(_incrementTask.Execute()) THEN + _myTextList.Id := _myTextList.Id + UINT#1; + _incrementTask.DoneWhen(_myTextList.Id>= UINT#1000); + END_IF; + + IF(_set2zeroTask.Execute()) THEN + _incrementTask.Restore(); + _myTextList.Id := UINT#0; + _set2zeroTask.DoneWhen(TRUE); + END_IF; + END_METHOD + END_CLASS +END_NAMESPACE diff --git a/src/integrations/ctrl/src/configuration.st b/src/integrations/ctrl/src/configuration.st index 723e41805..d52913748 100644 --- a/src/integrations/ctrl/src/configuration.st +++ b/src/integrations/ctrl/src/configuration.st @@ -26,6 +26,7 @@ CONFIGURATION MyConfiguration AxoMessengersDocu : AxoStaticMessengerDocuExample.Messengers; AxoRtc : AxoRtc.AxoS71500Rtc; AxoDataFragmentExchangeContext : AxoDataFramentsExchangeDocuExample.AxoDataFragmentExchangeContext; + AxoTextListExampleContext : AxoTextListExample.AxoTextListExampleContext; AxoCognexVisionDatamanExampleContext : AxoCognexVisionDatamanExamples.AxoCognexVisionDatamanExampleContext; process_data_manager: AxoDataExamples.AxoProcessDataManager; diff --git a/src/integrations/ctrl/src/program.st b/src/integrations/ctrl/src/program.st index 31b454dc8..8ca16e060 100644 --- a/src/integrations/ctrl/src/program.st +++ b/src/integrations/ctrl/src/program.st @@ -22,6 +22,7 @@ PROGRAM MyProgram AxoMessengersDocu : AxoStaticMessengerDocuExample.Messengers; AxoDataFragmentExchangeContext : AxoDataFramentsExchangeDocuExample.AxoDataFragmentExchangeContext; + AxoTextListExampleContext : AxoTextListExample.AxoTextListExampleContext; AxoCognexVisionDatamanExampleContext : AxoCognexVisionDatamanExamples.AxoCognexVisionDatamanExampleContext; AxoLoggers : AxoLoggerExamples.Loggers; @@ -63,6 +64,8 @@ PROGRAM MyProgram AxoMessengersDocu.InjectRtc(AxoRtc); AxoDataFragmentExchangeContext.Run(); + AxoTextListExampleContext.Run(); + AxoCognexVisionDatamanExampleContext.PlcInputs := REF(PlcInputs); AxoCognexVisionDatamanExampleContext.PlcOutputs := REF(PlcOutputs); AxoCognexVisionDatamanExampleContext.Run(); diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor index e990688c9..6cebcf736 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor @@ -19,23 +19,14 @@ -
    +@*
    - ActionDescription: -

    - Text: @TextValue -

    - - @code { - string TextValue = @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ActionDescription.ToString(); - } - @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ActionDescription + ActionDescription: @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ActionDescription.ToString()
    - ErrorDescription: - @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ErrorDescription + ErrorDescription: @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ErrorDescription.ToString()
    -
    +
    *@
    diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor new file mode 100644 index 000000000..328d32b92 --- /dev/null +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor @@ -0,0 +1,25 @@ +@page "/AxoTextListExample" +@using axopen_integrations +@using AXOpen.Core; + +

    AxoTextListExample

    + +
    +
    + AxoTextListExample +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor index 22f074c46..9897bdf52 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Shared/NavMenu.razor @@ -89,6 +89,11 @@ DocuExamples
    +
    Outputs : axosimple.Outputs; - - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR THIS.Initialize(parent); - THIS.Execute(Inputs, Outputs, PlcInputs, PlcOutputs); + THIS.Execute(Inputs, Outputs); END_METHOD METHOD PRIVATE Execute VAR_IN_OUT Inputs : axosimple.Inputs; Outputs : axosimple.Outputs; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; END_VAR // Component I/O immange and management handling. - Components.Update(THIS, Inputs, Outputs, PlcInputs, PlcOutputs); + Components.Update(THIS, Inputs, Outputs); // Process data manager ProcessData.Run(THIS); // Handles ground sequence @@ -411,7 +396,6 @@ NAMESPACE examples.PneumaticManipulator components.HorizontalCylinder.ActivateManualControl(); components.VerticalCylinder.ActivateManualControl(); components.GripperCylinder.ActivateManualControl(); - components.Citacka.ActivateManualControl(); END_METHOD END_CLASS diff --git a/src/templates.simple/ctrl/src/IO/CopyInputs.st b/src/templates.simple/ctrl/src/IO/CopyInputs.st deleted file mode 100644 index 4976a7f6e..000000000 --- a/src/templates.simple/ctrl/src/IO/CopyInputs.st +++ /dev/null @@ -1,147 +0,0 @@ -FUNCTION CopyInputs - VAR_EXTERNAL - HwInputs : HwInputs; - PlcInputs : PlcInputs; - END_VAR - PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; - PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; - PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; - PlcInputs._10a1_Results_Status_1 := HwInputs._10a1_Results_Status_1; - PlcInputs._10a1_Soft_Event_Control_1 := HwInputs._10a1_Soft_Event_Control_1; - PlcInputs._10a1_Result_Data_128_bytes_1[0] := HwInputs._10a1_Result_Data_128_bytes_1[0]; - PlcInputs._10a1_Result_Data_128_bytes_1[1] := HwInputs._10a1_Result_Data_128_bytes_1[1]; - PlcInputs._10a1_Result_Data_128_bytes_1[2] := HwInputs._10a1_Result_Data_128_bytes_1[2]; - PlcInputs._10a1_Result_Data_128_bytes_1[3] := HwInputs._10a1_Result_Data_128_bytes_1[3]; - PlcInputs._10a1_Result_Data_128_bytes_1[4] := HwInputs._10a1_Result_Data_128_bytes_1[4]; - PlcInputs._10a1_Result_Data_128_bytes_1[5] := HwInputs._10a1_Result_Data_128_bytes_1[5]; - PlcInputs._10a1_Result_Data_128_bytes_1[6] := HwInputs._10a1_Result_Data_128_bytes_1[6]; - PlcInputs._10a1_Result_Data_128_bytes_1[7] := HwInputs._10a1_Result_Data_128_bytes_1[7]; - PlcInputs._10a1_Result_Data_128_bytes_1[8] := HwInputs._10a1_Result_Data_128_bytes_1[8]; - PlcInputs._10a1_Result_Data_128_bytes_1[9] := HwInputs._10a1_Result_Data_128_bytes_1[9]; - PlcInputs._10a1_Result_Data_128_bytes_1[10] := HwInputs._10a1_Result_Data_128_bytes_1[10]; - PlcInputs._10a1_Result_Data_128_bytes_1[11] := HwInputs._10a1_Result_Data_128_bytes_1[11]; - PlcInputs._10a1_Result_Data_128_bytes_1[12] := HwInputs._10a1_Result_Data_128_bytes_1[12]; - PlcInputs._10a1_Result_Data_128_bytes_1[13] := HwInputs._10a1_Result_Data_128_bytes_1[13]; - PlcInputs._10a1_Result_Data_128_bytes_1[14] := HwInputs._10a1_Result_Data_128_bytes_1[14]; - PlcInputs._10a1_Result_Data_128_bytes_1[15] := HwInputs._10a1_Result_Data_128_bytes_1[15]; - PlcInputs._10a1_Result_Data_128_bytes_1[16] := HwInputs._10a1_Result_Data_128_bytes_1[16]; - PlcInputs._10a1_Result_Data_128_bytes_1[17] := HwInputs._10a1_Result_Data_128_bytes_1[17]; - PlcInputs._10a1_Result_Data_128_bytes_1[18] := HwInputs._10a1_Result_Data_128_bytes_1[18]; - PlcInputs._10a1_Result_Data_128_bytes_1[19] := HwInputs._10a1_Result_Data_128_bytes_1[19]; - PlcInputs._10a1_Result_Data_128_bytes_1[20] := HwInputs._10a1_Result_Data_128_bytes_1[20]; - PlcInputs._10a1_Result_Data_128_bytes_1[21] := HwInputs._10a1_Result_Data_128_bytes_1[21]; - PlcInputs._10a1_Result_Data_128_bytes_1[22] := HwInputs._10a1_Result_Data_128_bytes_1[22]; - PlcInputs._10a1_Result_Data_128_bytes_1[23] := HwInputs._10a1_Result_Data_128_bytes_1[23]; - PlcInputs._10a1_Result_Data_128_bytes_1[24] := HwInputs._10a1_Result_Data_128_bytes_1[24]; - PlcInputs._10a1_Result_Data_128_bytes_1[25] := HwInputs._10a1_Result_Data_128_bytes_1[25]; - PlcInputs._10a1_Result_Data_128_bytes_1[26] := HwInputs._10a1_Result_Data_128_bytes_1[26]; - PlcInputs._10a1_Result_Data_128_bytes_1[27] := HwInputs._10a1_Result_Data_128_bytes_1[27]; - PlcInputs._10a1_Result_Data_128_bytes_1[28] := HwInputs._10a1_Result_Data_128_bytes_1[28]; - PlcInputs._10a1_Result_Data_128_bytes_1[29] := HwInputs._10a1_Result_Data_128_bytes_1[29]; - PlcInputs._10a1_Result_Data_128_bytes_1[30] := HwInputs._10a1_Result_Data_128_bytes_1[30]; - PlcInputs._10a1_Result_Data_128_bytes_1[31] := HwInputs._10a1_Result_Data_128_bytes_1[31]; - PlcInputs._10a1_Result_Data_128_bytes_1[32] := HwInputs._10a1_Result_Data_128_bytes_1[32]; - PlcInputs._10a1_Result_Data_128_bytes_1[33] := HwInputs._10a1_Result_Data_128_bytes_1[33]; - PlcInputs._10a1_Result_Data_128_bytes_1[34] := HwInputs._10a1_Result_Data_128_bytes_1[34]; - PlcInputs._10a1_Result_Data_128_bytes_1[35] := HwInputs._10a1_Result_Data_128_bytes_1[35]; - PlcInputs._10a1_Result_Data_128_bytes_1[36] := HwInputs._10a1_Result_Data_128_bytes_1[36]; - PlcInputs._10a1_Result_Data_128_bytes_1[37] := HwInputs._10a1_Result_Data_128_bytes_1[37]; - PlcInputs._10a1_Result_Data_128_bytes_1[38] := HwInputs._10a1_Result_Data_128_bytes_1[38]; - PlcInputs._10a1_Result_Data_128_bytes_1[39] := HwInputs._10a1_Result_Data_128_bytes_1[39]; - PlcInputs._10a1_Result_Data_128_bytes_1[40] := HwInputs._10a1_Result_Data_128_bytes_1[40]; - PlcInputs._10a1_Result_Data_128_bytes_1[41] := HwInputs._10a1_Result_Data_128_bytes_1[41]; - PlcInputs._10a1_Result_Data_128_bytes_1[42] := HwInputs._10a1_Result_Data_128_bytes_1[42]; - PlcInputs._10a1_Result_Data_128_bytes_1[43] := HwInputs._10a1_Result_Data_128_bytes_1[43]; - PlcInputs._10a1_Result_Data_128_bytes_1[44] := HwInputs._10a1_Result_Data_128_bytes_1[44]; - PlcInputs._10a1_Result_Data_128_bytes_1[45] := HwInputs._10a1_Result_Data_128_bytes_1[45]; - PlcInputs._10a1_Result_Data_128_bytes_1[46] := HwInputs._10a1_Result_Data_128_bytes_1[46]; - PlcInputs._10a1_Result_Data_128_bytes_1[47] := HwInputs._10a1_Result_Data_128_bytes_1[47]; - PlcInputs._10a1_Result_Data_128_bytes_1[48] := HwInputs._10a1_Result_Data_128_bytes_1[48]; - PlcInputs._10a1_Result_Data_128_bytes_1[49] := HwInputs._10a1_Result_Data_128_bytes_1[49]; - PlcInputs._10a1_Result_Data_128_bytes_1[50] := HwInputs._10a1_Result_Data_128_bytes_1[50]; - PlcInputs._10a1_Result_Data_128_bytes_1[51] := HwInputs._10a1_Result_Data_128_bytes_1[51]; - PlcInputs._10a1_Result_Data_128_bytes_1[52] := HwInputs._10a1_Result_Data_128_bytes_1[52]; - PlcInputs._10a1_Result_Data_128_bytes_1[53] := HwInputs._10a1_Result_Data_128_bytes_1[53]; - PlcInputs._10a1_Result_Data_128_bytes_1[54] := HwInputs._10a1_Result_Data_128_bytes_1[54]; - PlcInputs._10a1_Result_Data_128_bytes_1[55] := HwInputs._10a1_Result_Data_128_bytes_1[55]; - PlcInputs._10a1_Result_Data_128_bytes_1[56] := HwInputs._10a1_Result_Data_128_bytes_1[56]; - PlcInputs._10a1_Result_Data_128_bytes_1[57] := HwInputs._10a1_Result_Data_128_bytes_1[57]; - PlcInputs._10a1_Result_Data_128_bytes_1[58] := HwInputs._10a1_Result_Data_128_bytes_1[58]; - PlcInputs._10a1_Result_Data_128_bytes_1[59] := HwInputs._10a1_Result_Data_128_bytes_1[59]; - PlcInputs._10a1_Result_Data_128_bytes_1[60] := HwInputs._10a1_Result_Data_128_bytes_1[60]; - PlcInputs._10a1_Result_Data_128_bytes_1[61] := HwInputs._10a1_Result_Data_128_bytes_1[61]; - PlcInputs._10a1_Result_Data_128_bytes_1[62] := HwInputs._10a1_Result_Data_128_bytes_1[62]; - PlcInputs._10a1_Result_Data_128_bytes_1[63] := HwInputs._10a1_Result_Data_128_bytes_1[63]; - PlcInputs._10a1_Result_Data_128_bytes_1[64] := HwInputs._10a1_Result_Data_128_bytes_1[64]; - PlcInputs._10a1_Result_Data_128_bytes_1[65] := HwInputs._10a1_Result_Data_128_bytes_1[65]; - PlcInputs._10a1_Result_Data_128_bytes_1[66] := HwInputs._10a1_Result_Data_128_bytes_1[66]; - PlcInputs._10a1_Result_Data_128_bytes_1[67] := HwInputs._10a1_Result_Data_128_bytes_1[67]; - PlcInputs._10a1_Result_Data_128_bytes_1[68] := HwInputs._10a1_Result_Data_128_bytes_1[68]; - PlcInputs._10a1_Result_Data_128_bytes_1[69] := HwInputs._10a1_Result_Data_128_bytes_1[69]; - PlcInputs._10a1_Result_Data_128_bytes_1[70] := HwInputs._10a1_Result_Data_128_bytes_1[70]; - PlcInputs._10a1_Result_Data_128_bytes_1[71] := HwInputs._10a1_Result_Data_128_bytes_1[71]; - PlcInputs._10a1_Result_Data_128_bytes_1[72] := HwInputs._10a1_Result_Data_128_bytes_1[72]; - PlcInputs._10a1_Result_Data_128_bytes_1[73] := HwInputs._10a1_Result_Data_128_bytes_1[73]; - PlcInputs._10a1_Result_Data_128_bytes_1[74] := HwInputs._10a1_Result_Data_128_bytes_1[74]; - PlcInputs._10a1_Result_Data_128_bytes_1[75] := HwInputs._10a1_Result_Data_128_bytes_1[75]; - PlcInputs._10a1_Result_Data_128_bytes_1[76] := HwInputs._10a1_Result_Data_128_bytes_1[76]; - PlcInputs._10a1_Result_Data_128_bytes_1[77] := HwInputs._10a1_Result_Data_128_bytes_1[77]; - PlcInputs._10a1_Result_Data_128_bytes_1[78] := HwInputs._10a1_Result_Data_128_bytes_1[78]; - PlcInputs._10a1_Result_Data_128_bytes_1[79] := HwInputs._10a1_Result_Data_128_bytes_1[79]; - PlcInputs._10a1_Result_Data_128_bytes_1[80] := HwInputs._10a1_Result_Data_128_bytes_1[80]; - PlcInputs._10a1_Result_Data_128_bytes_1[81] := HwInputs._10a1_Result_Data_128_bytes_1[81]; - PlcInputs._10a1_Result_Data_128_bytes_1[82] := HwInputs._10a1_Result_Data_128_bytes_1[82]; - PlcInputs._10a1_Result_Data_128_bytes_1[83] := HwInputs._10a1_Result_Data_128_bytes_1[83]; - PlcInputs._10a1_Result_Data_128_bytes_1[84] := HwInputs._10a1_Result_Data_128_bytes_1[84]; - PlcInputs._10a1_Result_Data_128_bytes_1[85] := HwInputs._10a1_Result_Data_128_bytes_1[85]; - PlcInputs._10a1_Result_Data_128_bytes_1[86] := HwInputs._10a1_Result_Data_128_bytes_1[86]; - PlcInputs._10a1_Result_Data_128_bytes_1[87] := HwInputs._10a1_Result_Data_128_bytes_1[87]; - PlcInputs._10a1_Result_Data_128_bytes_1[88] := HwInputs._10a1_Result_Data_128_bytes_1[88]; - PlcInputs._10a1_Result_Data_128_bytes_1[89] := HwInputs._10a1_Result_Data_128_bytes_1[89]; - PlcInputs._10a1_Result_Data_128_bytes_1[90] := HwInputs._10a1_Result_Data_128_bytes_1[90]; - PlcInputs._10a1_Result_Data_128_bytes_1[91] := HwInputs._10a1_Result_Data_128_bytes_1[91]; - PlcInputs._10a1_Result_Data_128_bytes_1[92] := HwInputs._10a1_Result_Data_128_bytes_1[92]; - PlcInputs._10a1_Result_Data_128_bytes_1[93] := HwInputs._10a1_Result_Data_128_bytes_1[93]; - PlcInputs._10a1_Result_Data_128_bytes_1[94] := HwInputs._10a1_Result_Data_128_bytes_1[94]; - PlcInputs._10a1_Result_Data_128_bytes_1[95] := HwInputs._10a1_Result_Data_128_bytes_1[95]; - PlcInputs._10a1_Result_Data_128_bytes_1[96] := HwInputs._10a1_Result_Data_128_bytes_1[96]; - PlcInputs._10a1_Result_Data_128_bytes_1[97] := HwInputs._10a1_Result_Data_128_bytes_1[97]; - PlcInputs._10a1_Result_Data_128_bytes_1[98] := HwInputs._10a1_Result_Data_128_bytes_1[98]; - PlcInputs._10a1_Result_Data_128_bytes_1[99] := HwInputs._10a1_Result_Data_128_bytes_1[99]; - PlcInputs._10a1_Result_Data_128_bytes_1[100] := HwInputs._10a1_Result_Data_128_bytes_1[100]; - PlcInputs._10a1_Result_Data_128_bytes_1[101] := HwInputs._10a1_Result_Data_128_bytes_1[101]; - PlcInputs._10a1_Result_Data_128_bytes_1[102] := HwInputs._10a1_Result_Data_128_bytes_1[102]; - PlcInputs._10a1_Result_Data_128_bytes_1[103] := HwInputs._10a1_Result_Data_128_bytes_1[103]; - PlcInputs._10a1_Result_Data_128_bytes_1[104] := HwInputs._10a1_Result_Data_128_bytes_1[104]; - PlcInputs._10a1_Result_Data_128_bytes_1[105] := HwInputs._10a1_Result_Data_128_bytes_1[105]; - PlcInputs._10a1_Result_Data_128_bytes_1[106] := HwInputs._10a1_Result_Data_128_bytes_1[106]; - PlcInputs._10a1_Result_Data_128_bytes_1[107] := HwInputs._10a1_Result_Data_128_bytes_1[107]; - PlcInputs._10a1_Result_Data_128_bytes_1[108] := HwInputs._10a1_Result_Data_128_bytes_1[108]; - PlcInputs._10a1_Result_Data_128_bytes_1[109] := HwInputs._10a1_Result_Data_128_bytes_1[109]; - PlcInputs._10a1_Result_Data_128_bytes_1[110] := HwInputs._10a1_Result_Data_128_bytes_1[110]; - PlcInputs._10a1_Result_Data_128_bytes_1[111] := HwInputs._10a1_Result_Data_128_bytes_1[111]; - PlcInputs._10a1_Result_Data_128_bytes_1[112] := HwInputs._10a1_Result_Data_128_bytes_1[112]; - PlcInputs._10a1_Result_Data_128_bytes_1[113] := HwInputs._10a1_Result_Data_128_bytes_1[113]; - PlcInputs._10a1_Result_Data_128_bytes_1[114] := HwInputs._10a1_Result_Data_128_bytes_1[114]; - PlcInputs._10a1_Result_Data_128_bytes_1[115] := HwInputs._10a1_Result_Data_128_bytes_1[115]; - PlcInputs._10a1_Result_Data_128_bytes_1[116] := HwInputs._10a1_Result_Data_128_bytes_1[116]; - PlcInputs._10a1_Result_Data_128_bytes_1[117] := HwInputs._10a1_Result_Data_128_bytes_1[117]; - PlcInputs._10a1_Result_Data_128_bytes_1[118] := HwInputs._10a1_Result_Data_128_bytes_1[118]; - PlcInputs._10a1_Result_Data_128_bytes_1[119] := HwInputs._10a1_Result_Data_128_bytes_1[119]; - PlcInputs._10a1_Result_Data_128_bytes_1[120] := HwInputs._10a1_Result_Data_128_bytes_1[120]; - PlcInputs._10a1_Result_Data_128_bytes_1[121] := HwInputs._10a1_Result_Data_128_bytes_1[121]; - PlcInputs._10a1_Result_Data_128_bytes_1[122] := HwInputs._10a1_Result_Data_128_bytes_1[122]; - PlcInputs._10a1_Result_Data_128_bytes_1[123] := HwInputs._10a1_Result_Data_128_bytes_1[123]; - PlcInputs._10a1_Result_Data_128_bytes_1[124] := HwInputs._10a1_Result_Data_128_bytes_1[124]; - PlcInputs._10a1_Result_Data_128_bytes_1[125] := HwInputs._10a1_Result_Data_128_bytes_1[125]; - PlcInputs._10a1_Result_Data_128_bytes_1[126] := HwInputs._10a1_Result_Data_128_bytes_1[126]; - PlcInputs._10a1_Result_Data_128_bytes_1[127] := HwInputs._10a1_Result_Data_128_bytes_1[127]; - PlcInputs._10a1_Result_Data_128_bytes_1[128] := HwInputs._10a1_Result_Data_128_bytes_1[128]; - PlcInputs._10a1_Result_Data_128_bytes_1[129] := HwInputs._10a1_Result_Data_128_bytes_1[129]; - PlcInputs._10a1_Result_Data_128_bytes_1[130] := HwInputs._10a1_Result_Data_128_bytes_1[130]; - PlcInputs._10a1_Result_Data_128_bytes_1[131] := HwInputs._10a1_Result_Data_128_bytes_1[131]; - PlcInputs._10a1_Result_Data_128_bytes_1[132] := HwInputs._10a1_Result_Data_128_bytes_1[132]; - PlcInputs._10a1_Result_Data_128_bytes_1[133] := HwInputs._10a1_Result_Data_128_bytes_1[133]; - PlcInputs._10a1_Result_Data_128_bytes_1[134] := HwInputs._10a1_Result_Data_128_bytes_1[134]; - PlcInputs._10a1_Result_Data_128_bytes_1[135] := HwInputs._10a1_Result_Data_128_bytes_1[135]; -END_FUNCTION diff --git a/src/templates.simple/ctrl/src/IO/CopyOutputs.st b/src/templates.simple/ctrl/src/IO/CopyOutputs.st deleted file mode 100644 index 8d2e266c0..000000000 --- a/src/templates.simple/ctrl/src/IO/CopyOutputs.st +++ /dev/null @@ -1,141 +0,0 @@ -FUNCTION CopyOutputs - VAR_EXTERNAL - HwOutputs : HwOutputs; - PlcOutputs : PlcOutputs; - END_VAR - HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; - HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; - HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; - HwOutputs._10a1_User_Data_128_bytes_1[0] := PlcOutputs._10a1_User_Data_128_bytes_1[0]; - HwOutputs._10a1_User_Data_128_bytes_1[1] := PlcOutputs._10a1_User_Data_128_bytes_1[1]; - HwOutputs._10a1_User_Data_128_bytes_1[2] := PlcOutputs._10a1_User_Data_128_bytes_1[2]; - HwOutputs._10a1_User_Data_128_bytes_1[3] := PlcOutputs._10a1_User_Data_128_bytes_1[3]; - HwOutputs._10a1_User_Data_128_bytes_1[4] := PlcOutputs._10a1_User_Data_128_bytes_1[4]; - HwOutputs._10a1_User_Data_128_bytes_1[5] := PlcOutputs._10a1_User_Data_128_bytes_1[5]; - HwOutputs._10a1_User_Data_128_bytes_1[6] := PlcOutputs._10a1_User_Data_128_bytes_1[6]; - HwOutputs._10a1_User_Data_128_bytes_1[7] := PlcOutputs._10a1_User_Data_128_bytes_1[7]; - HwOutputs._10a1_User_Data_128_bytes_1[8] := PlcOutputs._10a1_User_Data_128_bytes_1[8]; - HwOutputs._10a1_User_Data_128_bytes_1[9] := PlcOutputs._10a1_User_Data_128_bytes_1[9]; - HwOutputs._10a1_User_Data_128_bytes_1[10] := PlcOutputs._10a1_User_Data_128_bytes_1[10]; - HwOutputs._10a1_User_Data_128_bytes_1[11] := PlcOutputs._10a1_User_Data_128_bytes_1[11]; - HwOutputs._10a1_User_Data_128_bytes_1[12] := PlcOutputs._10a1_User_Data_128_bytes_1[12]; - HwOutputs._10a1_User_Data_128_bytes_1[13] := PlcOutputs._10a1_User_Data_128_bytes_1[13]; - HwOutputs._10a1_User_Data_128_bytes_1[14] := PlcOutputs._10a1_User_Data_128_bytes_1[14]; - HwOutputs._10a1_User_Data_128_bytes_1[15] := PlcOutputs._10a1_User_Data_128_bytes_1[15]; - HwOutputs._10a1_User_Data_128_bytes_1[16] := PlcOutputs._10a1_User_Data_128_bytes_1[16]; - HwOutputs._10a1_User_Data_128_bytes_1[17] := PlcOutputs._10a1_User_Data_128_bytes_1[17]; - HwOutputs._10a1_User_Data_128_bytes_1[18] := PlcOutputs._10a1_User_Data_128_bytes_1[18]; - HwOutputs._10a1_User_Data_128_bytes_1[19] := PlcOutputs._10a1_User_Data_128_bytes_1[19]; - HwOutputs._10a1_User_Data_128_bytes_1[20] := PlcOutputs._10a1_User_Data_128_bytes_1[20]; - HwOutputs._10a1_User_Data_128_bytes_1[21] := PlcOutputs._10a1_User_Data_128_bytes_1[21]; - HwOutputs._10a1_User_Data_128_bytes_1[22] := PlcOutputs._10a1_User_Data_128_bytes_1[22]; - HwOutputs._10a1_User_Data_128_bytes_1[23] := PlcOutputs._10a1_User_Data_128_bytes_1[23]; - HwOutputs._10a1_User_Data_128_bytes_1[24] := PlcOutputs._10a1_User_Data_128_bytes_1[24]; - HwOutputs._10a1_User_Data_128_bytes_1[25] := PlcOutputs._10a1_User_Data_128_bytes_1[25]; - HwOutputs._10a1_User_Data_128_bytes_1[26] := PlcOutputs._10a1_User_Data_128_bytes_1[26]; - HwOutputs._10a1_User_Data_128_bytes_1[27] := PlcOutputs._10a1_User_Data_128_bytes_1[27]; - HwOutputs._10a1_User_Data_128_bytes_1[28] := PlcOutputs._10a1_User_Data_128_bytes_1[28]; - HwOutputs._10a1_User_Data_128_bytes_1[29] := PlcOutputs._10a1_User_Data_128_bytes_1[29]; - HwOutputs._10a1_User_Data_128_bytes_1[30] := PlcOutputs._10a1_User_Data_128_bytes_1[30]; - HwOutputs._10a1_User_Data_128_bytes_1[31] := PlcOutputs._10a1_User_Data_128_bytes_1[31]; - HwOutputs._10a1_User_Data_128_bytes_1[32] := PlcOutputs._10a1_User_Data_128_bytes_1[32]; - HwOutputs._10a1_User_Data_128_bytes_1[33] := PlcOutputs._10a1_User_Data_128_bytes_1[33]; - HwOutputs._10a1_User_Data_128_bytes_1[34] := PlcOutputs._10a1_User_Data_128_bytes_1[34]; - HwOutputs._10a1_User_Data_128_bytes_1[35] := PlcOutputs._10a1_User_Data_128_bytes_1[35]; - HwOutputs._10a1_User_Data_128_bytes_1[36] := PlcOutputs._10a1_User_Data_128_bytes_1[36]; - HwOutputs._10a1_User_Data_128_bytes_1[37] := PlcOutputs._10a1_User_Data_128_bytes_1[37]; - HwOutputs._10a1_User_Data_128_bytes_1[38] := PlcOutputs._10a1_User_Data_128_bytes_1[38]; - HwOutputs._10a1_User_Data_128_bytes_1[39] := PlcOutputs._10a1_User_Data_128_bytes_1[39]; - HwOutputs._10a1_User_Data_128_bytes_1[40] := PlcOutputs._10a1_User_Data_128_bytes_1[40]; - HwOutputs._10a1_User_Data_128_bytes_1[41] := PlcOutputs._10a1_User_Data_128_bytes_1[41]; - HwOutputs._10a1_User_Data_128_bytes_1[42] := PlcOutputs._10a1_User_Data_128_bytes_1[42]; - HwOutputs._10a1_User_Data_128_bytes_1[43] := PlcOutputs._10a1_User_Data_128_bytes_1[43]; - HwOutputs._10a1_User_Data_128_bytes_1[44] := PlcOutputs._10a1_User_Data_128_bytes_1[44]; - HwOutputs._10a1_User_Data_128_bytes_1[45] := PlcOutputs._10a1_User_Data_128_bytes_1[45]; - HwOutputs._10a1_User_Data_128_bytes_1[46] := PlcOutputs._10a1_User_Data_128_bytes_1[46]; - HwOutputs._10a1_User_Data_128_bytes_1[47] := PlcOutputs._10a1_User_Data_128_bytes_1[47]; - HwOutputs._10a1_User_Data_128_bytes_1[48] := PlcOutputs._10a1_User_Data_128_bytes_1[48]; - HwOutputs._10a1_User_Data_128_bytes_1[49] := PlcOutputs._10a1_User_Data_128_bytes_1[49]; - HwOutputs._10a1_User_Data_128_bytes_1[50] := PlcOutputs._10a1_User_Data_128_bytes_1[50]; - HwOutputs._10a1_User_Data_128_bytes_1[51] := PlcOutputs._10a1_User_Data_128_bytes_1[51]; - HwOutputs._10a1_User_Data_128_bytes_1[52] := PlcOutputs._10a1_User_Data_128_bytes_1[52]; - HwOutputs._10a1_User_Data_128_bytes_1[53] := PlcOutputs._10a1_User_Data_128_bytes_1[53]; - HwOutputs._10a1_User_Data_128_bytes_1[54] := PlcOutputs._10a1_User_Data_128_bytes_1[54]; - HwOutputs._10a1_User_Data_128_bytes_1[55] := PlcOutputs._10a1_User_Data_128_bytes_1[55]; - HwOutputs._10a1_User_Data_128_bytes_1[56] := PlcOutputs._10a1_User_Data_128_bytes_1[56]; - HwOutputs._10a1_User_Data_128_bytes_1[57] := PlcOutputs._10a1_User_Data_128_bytes_1[57]; - HwOutputs._10a1_User_Data_128_bytes_1[58] := PlcOutputs._10a1_User_Data_128_bytes_1[58]; - HwOutputs._10a1_User_Data_128_bytes_1[59] := PlcOutputs._10a1_User_Data_128_bytes_1[59]; - HwOutputs._10a1_User_Data_128_bytes_1[60] := PlcOutputs._10a1_User_Data_128_bytes_1[60]; - HwOutputs._10a1_User_Data_128_bytes_1[61] := PlcOutputs._10a1_User_Data_128_bytes_1[61]; - HwOutputs._10a1_User_Data_128_bytes_1[62] := PlcOutputs._10a1_User_Data_128_bytes_1[62]; - HwOutputs._10a1_User_Data_128_bytes_1[63] := PlcOutputs._10a1_User_Data_128_bytes_1[63]; - HwOutputs._10a1_User_Data_128_bytes_1[64] := PlcOutputs._10a1_User_Data_128_bytes_1[64]; - HwOutputs._10a1_User_Data_128_bytes_1[65] := PlcOutputs._10a1_User_Data_128_bytes_1[65]; - HwOutputs._10a1_User_Data_128_bytes_1[66] := PlcOutputs._10a1_User_Data_128_bytes_1[66]; - HwOutputs._10a1_User_Data_128_bytes_1[67] := PlcOutputs._10a1_User_Data_128_bytes_1[67]; - HwOutputs._10a1_User_Data_128_bytes_1[68] := PlcOutputs._10a1_User_Data_128_bytes_1[68]; - HwOutputs._10a1_User_Data_128_bytes_1[69] := PlcOutputs._10a1_User_Data_128_bytes_1[69]; - HwOutputs._10a1_User_Data_128_bytes_1[70] := PlcOutputs._10a1_User_Data_128_bytes_1[70]; - HwOutputs._10a1_User_Data_128_bytes_1[71] := PlcOutputs._10a1_User_Data_128_bytes_1[71]; - HwOutputs._10a1_User_Data_128_bytes_1[72] := PlcOutputs._10a1_User_Data_128_bytes_1[72]; - HwOutputs._10a1_User_Data_128_bytes_1[73] := PlcOutputs._10a1_User_Data_128_bytes_1[73]; - HwOutputs._10a1_User_Data_128_bytes_1[74] := PlcOutputs._10a1_User_Data_128_bytes_1[74]; - HwOutputs._10a1_User_Data_128_bytes_1[75] := PlcOutputs._10a1_User_Data_128_bytes_1[75]; - HwOutputs._10a1_User_Data_128_bytes_1[76] := PlcOutputs._10a1_User_Data_128_bytes_1[76]; - HwOutputs._10a1_User_Data_128_bytes_1[77] := PlcOutputs._10a1_User_Data_128_bytes_1[77]; - HwOutputs._10a1_User_Data_128_bytes_1[78] := PlcOutputs._10a1_User_Data_128_bytes_1[78]; - HwOutputs._10a1_User_Data_128_bytes_1[79] := PlcOutputs._10a1_User_Data_128_bytes_1[79]; - HwOutputs._10a1_User_Data_128_bytes_1[80] := PlcOutputs._10a1_User_Data_128_bytes_1[80]; - HwOutputs._10a1_User_Data_128_bytes_1[81] := PlcOutputs._10a1_User_Data_128_bytes_1[81]; - HwOutputs._10a1_User_Data_128_bytes_1[82] := PlcOutputs._10a1_User_Data_128_bytes_1[82]; - HwOutputs._10a1_User_Data_128_bytes_1[83] := PlcOutputs._10a1_User_Data_128_bytes_1[83]; - HwOutputs._10a1_User_Data_128_bytes_1[84] := PlcOutputs._10a1_User_Data_128_bytes_1[84]; - HwOutputs._10a1_User_Data_128_bytes_1[85] := PlcOutputs._10a1_User_Data_128_bytes_1[85]; - HwOutputs._10a1_User_Data_128_bytes_1[86] := PlcOutputs._10a1_User_Data_128_bytes_1[86]; - HwOutputs._10a1_User_Data_128_bytes_1[87] := PlcOutputs._10a1_User_Data_128_bytes_1[87]; - HwOutputs._10a1_User_Data_128_bytes_1[88] := PlcOutputs._10a1_User_Data_128_bytes_1[88]; - HwOutputs._10a1_User_Data_128_bytes_1[89] := PlcOutputs._10a1_User_Data_128_bytes_1[89]; - HwOutputs._10a1_User_Data_128_bytes_1[90] := PlcOutputs._10a1_User_Data_128_bytes_1[90]; - HwOutputs._10a1_User_Data_128_bytes_1[91] := PlcOutputs._10a1_User_Data_128_bytes_1[91]; - HwOutputs._10a1_User_Data_128_bytes_1[92] := PlcOutputs._10a1_User_Data_128_bytes_1[92]; - HwOutputs._10a1_User_Data_128_bytes_1[93] := PlcOutputs._10a1_User_Data_128_bytes_1[93]; - HwOutputs._10a1_User_Data_128_bytes_1[94] := PlcOutputs._10a1_User_Data_128_bytes_1[94]; - HwOutputs._10a1_User_Data_128_bytes_1[95] := PlcOutputs._10a1_User_Data_128_bytes_1[95]; - HwOutputs._10a1_User_Data_128_bytes_1[96] := PlcOutputs._10a1_User_Data_128_bytes_1[96]; - HwOutputs._10a1_User_Data_128_bytes_1[97] := PlcOutputs._10a1_User_Data_128_bytes_1[97]; - HwOutputs._10a1_User_Data_128_bytes_1[98] := PlcOutputs._10a1_User_Data_128_bytes_1[98]; - HwOutputs._10a1_User_Data_128_bytes_1[99] := PlcOutputs._10a1_User_Data_128_bytes_1[99]; - HwOutputs._10a1_User_Data_128_bytes_1[100] := PlcOutputs._10a1_User_Data_128_bytes_1[100]; - HwOutputs._10a1_User_Data_128_bytes_1[101] := PlcOutputs._10a1_User_Data_128_bytes_1[101]; - HwOutputs._10a1_User_Data_128_bytes_1[102] := PlcOutputs._10a1_User_Data_128_bytes_1[102]; - HwOutputs._10a1_User_Data_128_bytes_1[103] := PlcOutputs._10a1_User_Data_128_bytes_1[103]; - HwOutputs._10a1_User_Data_128_bytes_1[104] := PlcOutputs._10a1_User_Data_128_bytes_1[104]; - HwOutputs._10a1_User_Data_128_bytes_1[105] := PlcOutputs._10a1_User_Data_128_bytes_1[105]; - HwOutputs._10a1_User_Data_128_bytes_1[106] := PlcOutputs._10a1_User_Data_128_bytes_1[106]; - HwOutputs._10a1_User_Data_128_bytes_1[107] := PlcOutputs._10a1_User_Data_128_bytes_1[107]; - HwOutputs._10a1_User_Data_128_bytes_1[108] := PlcOutputs._10a1_User_Data_128_bytes_1[108]; - HwOutputs._10a1_User_Data_128_bytes_1[109] := PlcOutputs._10a1_User_Data_128_bytes_1[109]; - HwOutputs._10a1_User_Data_128_bytes_1[110] := PlcOutputs._10a1_User_Data_128_bytes_1[110]; - HwOutputs._10a1_User_Data_128_bytes_1[111] := PlcOutputs._10a1_User_Data_128_bytes_1[111]; - HwOutputs._10a1_User_Data_128_bytes_1[112] := PlcOutputs._10a1_User_Data_128_bytes_1[112]; - HwOutputs._10a1_User_Data_128_bytes_1[113] := PlcOutputs._10a1_User_Data_128_bytes_1[113]; - HwOutputs._10a1_User_Data_128_bytes_1[114] := PlcOutputs._10a1_User_Data_128_bytes_1[114]; - HwOutputs._10a1_User_Data_128_bytes_1[115] := PlcOutputs._10a1_User_Data_128_bytes_1[115]; - HwOutputs._10a1_User_Data_128_bytes_1[116] := PlcOutputs._10a1_User_Data_128_bytes_1[116]; - HwOutputs._10a1_User_Data_128_bytes_1[117] := PlcOutputs._10a1_User_Data_128_bytes_1[117]; - HwOutputs._10a1_User_Data_128_bytes_1[118] := PlcOutputs._10a1_User_Data_128_bytes_1[118]; - HwOutputs._10a1_User_Data_128_bytes_1[119] := PlcOutputs._10a1_User_Data_128_bytes_1[119]; - HwOutputs._10a1_User_Data_128_bytes_1[120] := PlcOutputs._10a1_User_Data_128_bytes_1[120]; - HwOutputs._10a1_User_Data_128_bytes_1[121] := PlcOutputs._10a1_User_Data_128_bytes_1[121]; - HwOutputs._10a1_User_Data_128_bytes_1[122] := PlcOutputs._10a1_User_Data_128_bytes_1[122]; - HwOutputs._10a1_User_Data_128_bytes_1[123] := PlcOutputs._10a1_User_Data_128_bytes_1[123]; - HwOutputs._10a1_User_Data_128_bytes_1[124] := PlcOutputs._10a1_User_Data_128_bytes_1[124]; - HwOutputs._10a1_User_Data_128_bytes_1[125] := PlcOutputs._10a1_User_Data_128_bytes_1[125]; - HwOutputs._10a1_User_Data_128_bytes_1[126] := PlcOutputs._10a1_User_Data_128_bytes_1[126]; - HwOutputs._10a1_User_Data_128_bytes_1[127] := PlcOutputs._10a1_User_Data_128_bytes_1[127]; - HwOutputs._10a1_User_Data_128_bytes_1[128] := PlcOutputs._10a1_User_Data_128_bytes_1[128]; - HwOutputs._10a1_User_Data_128_bytes_1[129] := PlcOutputs._10a1_User_Data_128_bytes_1[129]; - HwOutputs._10a1_User_Data_128_bytes_1[130] := PlcOutputs._10a1_User_Data_128_bytes_1[130]; - HwOutputs._10a1_User_Data_128_bytes_1[131] := PlcOutputs._10a1_User_Data_128_bytes_1[131]; -END_FUNCTION diff --git a/src/templates.simple/ctrl/src/IO/HwInputs.st b/src/templates.simple/ctrl/src/IO/HwInputs.st deleted file mode 100644 index b7df6729a..000000000 --- a/src/templates.simple/ctrl/src/IO/HwInputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - HwInputs : STRUCT - _10a1_Acquisition_Status_1 AT %B82 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 AT %B85 : BYTE; - _10a1_Soft_Event_Control_1 AT %B86 : BYTE; - _10a1_Result_Data_128_bytes_1 AT %B87 : ARRAY[0..135] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/HwOutputs.st b/src/templates.simple/ctrl/src/IO/HwOutputs.st deleted file mode 100644 index 6c930f523..000000000 --- a/src/templates.simple/ctrl/src/IO/HwOutputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - HwOutputs : STRUCT - _10a1_Acquisition_Control_1 AT %B72 : BYTE; - _10a1_Results_Control_1 AT %B73 : BYTE; - _10a1_Soft_Event_Control_1 AT %B74 : BYTE; - _10a1_User_Data_128_bytes_1 AT %B75 : ARRAY[0..131] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/PlcInputs.st b/src/templates.simple/ctrl/src/IO/PlcInputs.st deleted file mode 100644 index 97b3efc59..000000000 --- a/src/templates.simple/ctrl/src/IO/PlcInputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - PlcInputs : STRUCT - _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/src/templates.simple/ctrl/src/IO/PlcOutputs.st b/src/templates.simple/ctrl/src/IO/PlcOutputs.st deleted file mode 100644 index 6389c2461..000000000 --- a/src/templates.simple/ctrl/src/IO/PlcOutputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - PlcOutputs : STRUCT - _10a1_Acquisition_Control_1 : BYTE; - _10a1_Results_Control_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/src/templates.simple/ctrl/src/configuration.st b/src/templates.simple/ctrl/src/configuration.st index 711ba97f4..f16476983 100644 --- a/src/templates.simple/ctrl/src/configuration.st +++ b/src/templates.simple/ctrl/src/configuration.st @@ -11,13 +11,4 @@ CONFIGURATION MyConfiguration ContextLogger : AXOpen.Logging.AxoLogger; END_VAR - //Copy this VAR_GLOBAL section into your configuration file inside your project. - //Do not change any names, addresses or any another content. - VAR_GLOBAL - HwInputs AT %IB0 : HwInputs; - HwOutputs AT %QB0 : HwOutputs; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR - END_CONFIGURATION diff --git a/src/templates.simple/ctrl/src/program.st b/src/templates.simple/ctrl/src/program.st index 3be4c6c44..5e2bf6b0a 100644 --- a/src/templates.simple/ctrl/src/program.st +++ b/src/templates.simple/ctrl/src/program.st @@ -8,32 +8,13 @@ PROGRAM MyProgram ContextLogger : AXOpen.Logging.AxoLogger; END_VAR - //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. - //Do not change any names, addresses or any another content. - VAR_EXTERNAL - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR - //Copy this function call at the very beginning of your program. - //Do not change any names, addresses or any another content. - CopyInputs(); - - //PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := BYTE#127; - // Never modif this the context needs references to IN/OUT structures before it is used. Context.Inputs := REF(Inputs); Context.Outputs := REF(Outputs); - Context.PlcInputs := REF(PlcInputs); - Context.PlcOutputs := REF(PlcOutputs); - ContextLogger.SetMinimumLevel(AXOpen.Logging.eLogLevel#Verbose); Context.InjectRtc(S71500Rtc); Context.InjectLogger(ContextLogger); // Executes the main context of this application. Context.Run(); - - //Copy this function call at the very end of your program. - //Do not change any names, addresses or any another content. - CopyOutputs(); END_PROGRAM From b1ee9c3a08f59c06831041c23bd8b3137252c341 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Wed, 2 Aug 2023 22:21:15 +0200 Subject: [PATCH 18/32] some PLC code cleanup --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 17 ---------------- .../Tasks/AxoDatamanClearResultData.st | 8 +------- .../v_6_0_0/Tasks/AxoDatamanRead.st | 11 +--------- .../AxoDataman/v_6_0_0/AxoDataman.cs | 4 ++-- .../ctrl/src/AxoComponent_Status.st | 13 +++++------- .../ctrl/src/AxoDictionaryIdentifier.st | 7 ------- .../AxoTextList/AxoTextListView.razor.cs | 20 ++++++++++++------- 7 files changed, 22 insertions(+), 58 deletions(-) delete mode 100644 src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 33df4ed33..208d4bcac 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -57,9 +57,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 VAR _index : INT; END_VAR - Status.ActionId := UINT#0; - Status.ErrorId := UINT#0; - Status.Action.Id := UINT#0; Status.Error.Id := UINT#0; @@ -95,7 +92,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_FOR; IF NOT _ResultsStatus.ErrorDetected THEN - Status.ActionId := UINT#300; Status.Action.Id := UINT#300; _restoreTask.DoneWhen(TRUE); END_IF; @@ -150,12 +146,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; ELSE Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; - Status.ErrorId := UINT#708; Status.Error.Id := UINT#708; UpdateInputs := FALSE; END_IF; ELSE - Status.ErrorId := UINT#709; Status.Error.Id := UINT#709; UpdateInputs := FALSE; Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; @@ -210,12 +204,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSIF (UPPER_BOUND(UserData^,1) = 253) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE - Status.ErrorId := UINT#710; Status.Error.Id := UINT#710; UpdateOutputs := FALSE; END_IF; ELSE - Status.ErrorId := UINT#711; Status.Error.Id := UINT#711; UpdateOutputs := FALSE; END_IF; @@ -242,25 +234,18 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR IsValidReferences := FALSE; IF AcquisitionControl = NULL THEN - Status.ErrorId := UINT#701; Status.Error.Id := UINT#701; ELSIF AcquisitionStatus = NULL THEN - Status.ErrorId := UINT#702; Status.Error.Id := UINT#702; ELSIF ResultsControl = NULL THEN - Status.ErrorId := UINT#703; Status.Error.Id := UINT#703; ELSIF SoftEventControl = NULL THEN Status.Error.Id := UINT#704; - Status.ErrorId := UINT#704; ELSIF SoftEventStatus = NULL THEN - Status.ErrorId := UINT#705; Status.Error.Id := UINT#705; ELSIF ResultData = NULL THEN - Status.ErrorId := UINT#706; Status.Error.Id := UINT#706; ELSIF UserData = NULL THEN - Status.ErrorId := UINT#707; Status.Error.Id := UINT#707; ELSE IsValidReferences := TRUE; @@ -283,7 +268,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 UserData : REF_TO ARRAY[*] OF BYTE; END_VAR IF parent = NULL THEN - Status.ErrorId := UINT#700; Status.Error.Id := UINT#700; RETURN; END_IF; @@ -309,7 +293,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 UserData : REF_TO ARRAY[*] OF BYTE; END_VAR IF parent = NULL THEN - Status.ErrorId := UINT#700; Status.Error.Id := UINT#700; RETURN; END_IF; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index e54fbcc86..4cec0cc71 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -1,4 +1,4 @@ -//USING AXOpen.Core; +USING AXOpen.Core; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoDatamanClearResultData EXTENDS AXOpen.Core.AxoTask @@ -35,7 +35,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _Status := Status; IF THIS.Execute() THEN IF _progress = 0 THEN - Status^.ActionId := UINT#302; Status^.Action.Id := UINT#302; THIS.CallTimers(FALSE); _progress := _progress + 1; @@ -57,7 +56,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 2 THEN IF _infoTimer.output THEN - Status^.ErrorId := UINT#600; Status^.Error.Id := UINT#600; END_IF; IF NOT ResultsStatus^.ResultsAvailable THEN @@ -96,28 +94,24 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE OnAbort IF _Status <> NULL THEN - _Status^.ActionId := UINT#600; _Status^.Action.Id := UINT#600; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone IF _Status <> NULL THEN - _Status^.ActionId := UINT#303; _Status^.Action.Id := UINT#303; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError IF _Status <> NULL THEN - _Status^.ActionId := UINT#700; _Status^.Action.Id := UINT#700; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart IF _Status <> NULL THEN - _Status^.ActionId := UINT#301; _Status^.Action.Id := UINT#301; END_IF; END_METHOD diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index d634d4ffb..2110e83a8 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -1,4 +1,4 @@ -// USING AXOpen.Core; +USING AXOpen.Core; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoDatamanRead EXTENDS AXOpen.Core.AxoTask @@ -36,7 +36,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF THIS.Execute() THEN IF _progress = 0 THEN - Status^.ActionId := UINT#305; Status^.Action.Id := UINT#305; THIS.CallTimers(FALSE); IF ResultsStatus^.ErrorDetected THEN @@ -52,7 +51,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ResultsControl^.EnableResultBuffering := FALSE; ResultsControl^.ResultsAcknowledge := ResultsStatus^.ResultsAvailable; IF _infoTimer.output THEN - Status^.ErrorId := UINT#600; Status^.Error.Id := UINT#600; END_IF; IF NOT ResultsStatus^.ResultsAvailable THEN @@ -63,7 +61,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 2 THEN IF _infoTimer.output THEN - Status^.ErrorId := UINT#601; Status^.Error.Id := UINT#601; END_IF; IF AcquisitionStatus^.TriggerReady THEN @@ -75,7 +72,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 3 THEN AcquisitionControl^.Trigger := TRUE; IF _infoTimer.output THEN - Status^.ErrorId := UINT#602; Status^.Error.Id := UINT#602; END_IF; IF AcquisitionStatus^.TriggerAcknowledge THEN @@ -86,7 +82,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 4 THEN IF _infoTimer.output THEN - Status^.ErrorId := UINT#603; Status^.Error.Id := UINT#603; END_IF; IF ResultsStatus^.ResultsAvailable THEN @@ -159,28 +154,24 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE OnAbort IF _Status <> NULL THEN - _Status^.ActionId := UINT#601; _Status^.Action.Id := UINT#601; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone IF _Status <> NULL THEN - _Status^.ActionId := UINT#306; _Status^.Action.Id := UINT#306; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError IF _Status <> NULL THEN - _Status^.ActionId := UINT#701; _Status^.Action.Id := UINT#701; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart IF _Status <> NULL THEN - _Status^.ActionId := UINT#304; _Status^.Action.Id := UINT#304; END_IF; END_METHOD diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index 32b6438f9..c09b5b095 100644 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -45,7 +45,7 @@ public string ErrorDescription } string errorDescription = " "; - if (errorDescriptionDict.TryGetValue(ErrorId.LastValue, out errorDescription)) + if (errorDescriptionDict.TryGetValue(Error.Id.LastValue, out errorDescription)) { return errorDescription; } @@ -82,7 +82,7 @@ public string ActionDescription } string actionDescription = " "; - if(actionDescriptionDict.TryGetValue(ActionId.LastValue, out actionDescription)) + if(actionDescriptionDict.TryGetValue(Action.Id.LastValue, out actionDescription)) { return actionDescription; } diff --git a/src/components.abstractions/ctrl/src/AxoComponent_Status.st b/src/components.abstractions/ctrl/src/AxoComponent_Status.st index ed6aff465..b20fdb004 100644 --- a/src/components.abstractions/ctrl/src/AxoComponent_Status.st +++ b/src/components.abstractions/ctrl/src/AxoComponent_Status.st @@ -1,15 +1,12 @@ +USING AXOpen.Core; + NAMESPACE AXOpen.Components.Abstractions CLASS PUBLIC AxoComponent_Status - VAR PUBLIC - {#ix-set:AttributeName = "ActionDescription |[[1]ActionDescription]|"} - ActionId : UINT; - {#ix-set:AttributeName = "ErrorDescription |[[1]ErrorDescription]|"} - ErrorId : UINT; - + VAR PUBLIC {#ix-set:AttributeName = "ActionDescription |[[1]ActionDescription]|"} - Action : AxoDictionaryIdentifier; + Action : AXOpen.Core.AxoTextList; {#ix-set:AttributeName = "ErrorDescription |[[1]ErrorDescription]|"} - Error : AxoDictionaryIdentifier; + Error : AXOpen.Core.AxoTextList; END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st b/src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st deleted file mode 100644 index 48f37a45b..000000000 --- a/src/components.abstractions/ctrl/src/AxoDictionaryIdentifier.st +++ /dev/null @@ -1,7 +0,0 @@ -NAMESPACE AXOpen.Components.Abstractions - TYPE AxoDictionaryIdentifier : - STRUCT - Id : UINT; - END_STRUCT; - END_TYPE -END_NAMESPACE \ No newline at end of file diff --git a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs index 62a318411..49ffdea60 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs @@ -1,10 +1,4 @@ -using System.Net.Http.Headers; -using System.Security.Principal; -using AXSharp.Connector; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; - -namespace AXOpen.Core +namespace AXOpen.Core { public partial class AxoTextListView : IDisposable { @@ -40,6 +34,12 @@ public AxoTextListCommandView() { } } + public class AxoTextListControlView : AxoTextListView + { + public AxoTextListControlView() + { + } + } public class AxoTextListStatusView : AxoTextListView { @@ -47,4 +47,10 @@ public AxoTextListStatusView() { } } + public class AxoTextListDisplayView : AxoTextListView + { + public AxoTextListDisplayView() + { + } + } } From 59b56afd89f2a7b8f8ae31b7df31af0a8877f899 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Wed, 2 Aug 2023 22:24:11 +0200 Subject: [PATCH 19/32] some .NET code cleanup --- .../AxoDictionaryIdentifierView.razor | 11 ---- .../AxoDictionaryIdentifierView.razor.cs | 50 ------------------- .../AxoDictionaryIdentifier.cs | 15 ------ 3 files changed, 76 deletions(-) delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor deleted file mode 100644 index 8e95b86cb..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor +++ /dev/null @@ -1,11 +0,0 @@ -@namespace AXOpen.Components.Abstractions -@using AXSharp.Connector; -@using Microsoft.AspNetCore.Components.Authorization -@inherits RenderableComplexComponentBase -@implements IDisposable; - -
    -
    - @Description -
    -
    \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs deleted file mode 100644 index 90b6f8c40..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/AxoDictionaryIdentifier/AxoDictionaryIdentifierView.razor.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Net.Http.Headers; -using System.Security.Principal; -using AXSharp.Connector; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; - -namespace AXOpen.Components.Abstractions -{ - public partial class AxoDictionaryIdentifierView : IDisposable - { - protected override void OnInitialized() - { - base.OnInitialized(); - UpdateValuesOnChange(Component); - } - - public string Description => Component.AttributeName; - } - - public class AxoDictionaryIdentifierCommandView : AxoDictionaryIdentifierView - { - public AxoDictionaryIdentifierCommandView() - { - ; - } - } - - public class AxoDictionaryIdentifierControlView : AxoDictionaryIdentifierView - { - public AxoDictionaryIdentifierControlView() - { - ; - } - } - - public class AxoDictionaryIdentifierStatusView : AxoDictionaryIdentifierView - { - public AxoDictionaryIdentifierStatusView() - { - ; - } - } - public class AxoDictionaryIdentifierDisplayView : AxoDictionaryIdentifierView - { - public AxoDictionaryIdentifierDisplayView() - { - ; - } - } -} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs deleted file mode 100644 index 3a53ad50e..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions/AxoDictionaryIdentifier/AxoDictionaryIdentifier.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using AXSharp.Connector; -using AXSharp.Connector.ValueTypes; -using System.Collections.Generic; -using AXOpen; -using System.ComponentModel; -using System.Security.Principal; - -namespace AXOpen.Components.Abstraction -{ - public partial class AxoDictionaryIdentifier - { - - } -} \ No newline at end of file From 17fc2095f17877e1bb3fa98eb944af6b7dbd2b7c Mon Sep 17 00:00:00 2001 From: TomKovac Date: Wed, 2 Aug 2023 23:04:48 +0200 Subject: [PATCH 20/32] AxoDataman rdy2 review --- .../AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st | 1 + .../ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st | 1 + .../axopen_cognex_vision_blazor.csproj | 4 ++-- .../AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj | 6 +++--- src/AXOpen.sln | 1 + .../axopen_components_abstractions_blazor.csproj | 4 ++-- .../ix_ax_axopen_components_abstractions.csproj | 4 ++-- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 4cec0cc71..3b0ddfcff 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -36,6 +36,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF THIS.Execute() THEN IF _progress = 0 THEN Status^.Action.Id := UINT#302; + Status^.Error.Id := UINT#0; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index 2110e83a8..74e236f58 100644 --- a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -37,6 +37,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF THIS.Execute() THEN IF _progress = 0 THEN Status^.Action.Id := UINT#305; + Status^.Error.Id := UINT#0; THIS.CallTimers(FALSE); IF ResultsStatus^.ErrorDetected THEN _progress := 20; diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj index 32d5db5cd..02479ed2e 100644 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj @@ -19,8 +19,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj index a78047f4b..3605271fc 100644 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj +++ b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj @@ -10,9 +10,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/AXOpen.sln b/src/AXOpen.sln index e59c9e759..ae4f399dc 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -151,6 +151,7 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_tests", "AXOpen.Cognex.Vision\tests\AXOpen.Cognex.Vision.Tests\axopen_cognex_vision_tests.csproj", "{58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_components_abstractions_blazor", "components.abstractions\src\AXOpen.Components.Abstractions.Blazor\axopen_components_abstractions_blazor.csproj", "{F99B9470-120F-4D27-8FD7-D1AF5C306A23}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".config", ".config", "{2B02D701-3632-4D58-9B5B-E43D9E556ACB}" ProjectSection(SolutionItems) = preProject templates.simple\.config\dotnet-tools.json = templates.simple\.config\dotnet-tools.json diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj index bdfe5a9c8..3604e371a 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj @@ -19,8 +19,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj index cc12f3a70..f5ae4a8f1 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + From b05fe3a1bd2c49d428ac4eacb299f0756e6dbdeb Mon Sep 17 00:00:00 2001 From: TomKovac Date: Thu, 3 Aug 2023 11:40:59 +0200 Subject: [PATCH 21/32] cleanup and refactoring --- Export/PLC_1/CopyInputs.st | 223 ------ Export/PLC_1/CopyOutputs.st | 210 ----- Export/PLC_1/HwInputs.st | 15 - Export/PLC_1/HwOutputs.st | 14 - Export/PLC_1/PlcInputs.st | 15 - Export/PLC_1/PlcOutputs.st | 14 - ..._COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION | 8 - .../_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM | 12 - cake/BuildContext.cs | 2 +- close | 750 ------------------ docfx/articles/giudelines/componets.md | 7 +- src/AXOpen-packable-only.slnf | 5 +- .../ExampleJsInterop.cs | 37 - .../wwwroot/exampleJsInterop.js | 6 - .../AxoDataman/v_6_0_0/AxoDataman.cs | 97 --- src/AXOpen.sln | 71 +- .../Properties/AssemblyInfo.cs | 3 - .../_Imports.razor | 2 - ...open_components_abstractions_blazor.csproj | 31 - .../package-lock.json | 11 - .../wwwroot/background.png | Bin 378 -> 0 bytes .../wwwroot/exampleJsInterop.js | 6 - .../Usings.cs | 1 - ...xopen_components_abstractions_tests.csproj | 42 - .../xunit.runner.json | 4 - .../ctrl/.gitignore | 0 .../ctrl/AXSharp.config.json | 0 .../ctrl/apax.yml | 0 .../ctrl/package-lock.json | 0 .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 0 .../Tasks/AxoDatamanClearResultData.st | 0 .../v_6_0_0/Tasks/AxoDatamanRead.st | 0 .../AxoDataman_AcquisitionControl.st | 0 .../AxoDataman_AcquisitionStatus.st | 0 .../AxoDataman_Config.st | 0 .../AxoDataman_Results.st | 0 .../AxoDataman_ResultsControl.st | 0 .../AxoDataman_ResultsStatus.st | 0 .../AxoDataman_SignalStates.st | 0 .../AxoDataman_SoftEventControl.st | 0 .../AxoDataman_SoftEventStatus.st | 0 .../AxoDataman_Status.st | 0 .../TypeStructuresAndEnums/AxoDataman_User.st | 0 .../eAxoDataman_ResultDataSize.st | 0 .../eAxoDataman_UserDataSize.st | 0 .../Properties/AssemblyInfo.cs | 0 .../_Imports.razor | 0 .../axopen_cognex_vision_blazor.csproj | 0 .../package-lock.json | 0 .../wwwroot/background.png | Bin .../AxoDataman/v_6_0_0/AxoDataman.cs | 97 +++ .../Properties/AssemblyInfo.cs | 0 .../Resources/PlcStringResources.Designer.cs | 0 .../Resources/PlcStringResources.resx | 0 .../ix_ax_axopen_cognex_vision.csproj | 0 .../AXOpen.Cognex.Vision.Tests/Usings.cs | 0 .../axopen_cognex_vision_tests.csproj | 0 .../xunit.runner.json | 0 .../ctrl/src/AxoComponent/AxoComponent.st | 2 +- src/integrations/ctrl/apax.yml | 4 +- .../src/AXOpen.Integrations.Blazor/Program.cs | 11 + .../axopen_integrations.csproj | 2 +- src/templates.simple/ctrl/Reader.mon | 7 - src/templates.simple/ctrl/Reader_hw.mon | 8 - src/templates.simple/ctrl/Reader_plc.mon | 8 - src/templates.simple/ctrl/snippets/lukas.json | 20 - .../ctrl/src/Examples/PneumaticManipulator.st | 4 +- 67 files changed, 152 insertions(+), 1597 deletions(-) delete mode 100644 Export/PLC_1/CopyInputs.st delete mode 100644 Export/PLC_1/CopyOutputs.st delete mode 100644 Export/PLC_1/HwInputs.st delete mode 100644 Export/PLC_1/HwOutputs.st delete mode 100644 Export/PLC_1/PlcInputs.st delete mode 100644 Export/PLC_1/PlcOutputs.st delete mode 100644 Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION delete mode 100644 Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM delete mode 100644 close delete mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs delete mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js delete mode 100644 src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/background.png delete mode 100644 src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js delete mode 100644 src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs delete mode 100644 src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj delete mode 100644 src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/.gitignore (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/AXSharp.config.json (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/apax.yml (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/package-lock.json (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision.Blazor/package-lock.json (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png (100%) create mode 100644 src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/tests/AXOpen.Cognex.Vision.Tests/Usings.cs (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj (100%) rename src/{AXOpen.Cognex.Vision => components.cognex.vision}/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json (100%) delete mode 100644 src/templates.simple/ctrl/Reader.mon delete mode 100644 src/templates.simple/ctrl/Reader_hw.mon delete mode 100644 src/templates.simple/ctrl/Reader_plc.mon delete mode 100644 src/templates.simple/ctrl/snippets/lukas.json diff --git a/Export/PLC_1/CopyInputs.st b/Export/PLC_1/CopyInputs.st deleted file mode 100644 index a1690b2c6..000000000 --- a/Export/PLC_1/CopyInputs.st +++ /dev/null @@ -1,223 +0,0 @@ -FUNCTION CopyInputs - VAR_EXTERNAL - HwInputs : HwInputs; - PlcInputs : PlcInputs; - END_VAR - PlcInputs._11a1_DI_8x24VDC_ST_1 := HwInputs._11a1_DI_8x24VDC_ST_1; - PlcInputs._11a1_DI_8x24VDC_ST_2 := HwInputs._11a1_DI_8x24VDC_ST_2; - PlcInputs._12a1_Acquisition_Status_1[0] := HwInputs._12a1_Acquisition_Status_1[0]; - PlcInputs._12a1_Acquisition_Status_1[1] := HwInputs._12a1_Acquisition_Status_1[1]; - PlcInputs._12a1_Acquisition_Status_1[2] := HwInputs._12a1_Acquisition_Status_1[2]; - PlcInputs._12a1_Inspection_Status_1 := HwInputs._12a1_Inspection_Status_1; - PlcInputs._12a1_Command_Control_1 := HwInputs._12a1_Command_Control_1; - PlcInputs._12a1_SoftEvent_Control_1 := HwInputs._12a1_SoftEvent_Control_1; - PlcInputs._12a1_Results_64_bytes_1[0] := HwInputs._12a1_Results_64_bytes_1[0]; - PlcInputs._12a1_Results_64_bytes_1[1] := HwInputs._12a1_Results_64_bytes_1[1]; - PlcInputs._12a1_Results_64_bytes_1[2] := HwInputs._12a1_Results_64_bytes_1[2]; - PlcInputs._12a1_Results_64_bytes_1[3] := HwInputs._12a1_Results_64_bytes_1[3]; - PlcInputs._12a1_Results_64_bytes_1[4] := HwInputs._12a1_Results_64_bytes_1[4]; - PlcInputs._12a1_Results_64_bytes_1[5] := HwInputs._12a1_Results_64_bytes_1[5]; - PlcInputs._12a1_Results_64_bytes_1[6] := HwInputs._12a1_Results_64_bytes_1[6]; - PlcInputs._12a1_Results_64_bytes_1[7] := HwInputs._12a1_Results_64_bytes_1[7]; - PlcInputs._12a1_Results_64_bytes_1[8] := HwInputs._12a1_Results_64_bytes_1[8]; - PlcInputs._12a1_Results_64_bytes_1[9] := HwInputs._12a1_Results_64_bytes_1[9]; - PlcInputs._12a1_Results_64_bytes_1[10] := HwInputs._12a1_Results_64_bytes_1[10]; - PlcInputs._12a1_Results_64_bytes_1[11] := HwInputs._12a1_Results_64_bytes_1[11]; - PlcInputs._12a1_Results_64_bytes_1[12] := HwInputs._12a1_Results_64_bytes_1[12]; - PlcInputs._12a1_Results_64_bytes_1[13] := HwInputs._12a1_Results_64_bytes_1[13]; - PlcInputs._12a1_Results_64_bytes_1[14] := HwInputs._12a1_Results_64_bytes_1[14]; - PlcInputs._12a1_Results_64_bytes_1[15] := HwInputs._12a1_Results_64_bytes_1[15]; - PlcInputs._12a1_Results_64_bytes_1[16] := HwInputs._12a1_Results_64_bytes_1[16]; - PlcInputs._12a1_Results_64_bytes_1[17] := HwInputs._12a1_Results_64_bytes_1[17]; - PlcInputs._12a1_Results_64_bytes_1[18] := HwInputs._12a1_Results_64_bytes_1[18]; - PlcInputs._12a1_Results_64_bytes_1[19] := HwInputs._12a1_Results_64_bytes_1[19]; - PlcInputs._12a1_Results_64_bytes_1[20] := HwInputs._12a1_Results_64_bytes_1[20]; - PlcInputs._12a1_Results_64_bytes_1[21] := HwInputs._12a1_Results_64_bytes_1[21]; - PlcInputs._12a1_Results_64_bytes_1[22] := HwInputs._12a1_Results_64_bytes_1[22]; - PlcInputs._12a1_Results_64_bytes_1[23] := HwInputs._12a1_Results_64_bytes_1[23]; - PlcInputs._12a1_Results_64_bytes_1[24] := HwInputs._12a1_Results_64_bytes_1[24]; - PlcInputs._12a1_Results_64_bytes_1[25] := HwInputs._12a1_Results_64_bytes_1[25]; - PlcInputs._12a1_Results_64_bytes_1[26] := HwInputs._12a1_Results_64_bytes_1[26]; - PlcInputs._12a1_Results_64_bytes_1[27] := HwInputs._12a1_Results_64_bytes_1[27]; - PlcInputs._12a1_Results_64_bytes_1[28] := HwInputs._12a1_Results_64_bytes_1[28]; - PlcInputs._12a1_Results_64_bytes_1[29] := HwInputs._12a1_Results_64_bytes_1[29]; - PlcInputs._12a1_Results_64_bytes_1[30] := HwInputs._12a1_Results_64_bytes_1[30]; - PlcInputs._12a1_Results_64_bytes_1[31] := HwInputs._12a1_Results_64_bytes_1[31]; - PlcInputs._12a1_Results_64_bytes_1[32] := HwInputs._12a1_Results_64_bytes_1[32]; - PlcInputs._12a1_Results_64_bytes_1[33] := HwInputs._12a1_Results_64_bytes_1[33]; - PlcInputs._12a1_Results_64_bytes_1[34] := HwInputs._12a1_Results_64_bytes_1[34]; - PlcInputs._12a1_Results_64_bytes_1[35] := HwInputs._12a1_Results_64_bytes_1[35]; - PlcInputs._12a1_Results_64_bytes_1[36] := HwInputs._12a1_Results_64_bytes_1[36]; - PlcInputs._12a1_Results_64_bytes_1[37] := HwInputs._12a1_Results_64_bytes_1[37]; - PlcInputs._12a1_Results_64_bytes_1[38] := HwInputs._12a1_Results_64_bytes_1[38]; - PlcInputs._12a1_Results_64_bytes_1[39] := HwInputs._12a1_Results_64_bytes_1[39]; - PlcInputs._12a1_Results_64_bytes_1[40] := HwInputs._12a1_Results_64_bytes_1[40]; - PlcInputs._12a1_Results_64_bytes_1[41] := HwInputs._12a1_Results_64_bytes_1[41]; - PlcInputs._12a1_Results_64_bytes_1[42] := HwInputs._12a1_Results_64_bytes_1[42]; - PlcInputs._12a1_Results_64_bytes_1[43] := HwInputs._12a1_Results_64_bytes_1[43]; - PlcInputs._12a1_Results_64_bytes_1[44] := HwInputs._12a1_Results_64_bytes_1[44]; - PlcInputs._12a1_Results_64_bytes_1[45] := HwInputs._12a1_Results_64_bytes_1[45]; - PlcInputs._12a1_Results_64_bytes_1[46] := HwInputs._12a1_Results_64_bytes_1[46]; - PlcInputs._12a1_Results_64_bytes_1[47] := HwInputs._12a1_Results_64_bytes_1[47]; - PlcInputs._12a1_Results_64_bytes_1[48] := HwInputs._12a1_Results_64_bytes_1[48]; - PlcInputs._12a1_Results_64_bytes_1[49] := HwInputs._12a1_Results_64_bytes_1[49]; - PlcInputs._12a1_Results_64_bytes_1[50] := HwInputs._12a1_Results_64_bytes_1[50]; - PlcInputs._12a1_Results_64_bytes_1[51] := HwInputs._12a1_Results_64_bytes_1[51]; - PlcInputs._12a1_Results_64_bytes_1[52] := HwInputs._12a1_Results_64_bytes_1[52]; - PlcInputs._12a1_Results_64_bytes_1[53] := HwInputs._12a1_Results_64_bytes_1[53]; - PlcInputs._12a1_Results_64_bytes_1[54] := HwInputs._12a1_Results_64_bytes_1[54]; - PlcInputs._12a1_Results_64_bytes_1[55] := HwInputs._12a1_Results_64_bytes_1[55]; - PlcInputs._12a1_Results_64_bytes_1[56] := HwInputs._12a1_Results_64_bytes_1[56]; - PlcInputs._12a1_Results_64_bytes_1[57] := HwInputs._12a1_Results_64_bytes_1[57]; - PlcInputs._12a1_Results_64_bytes_1[58] := HwInputs._12a1_Results_64_bytes_1[58]; - PlcInputs._12a1_Results_64_bytes_1[59] := HwInputs._12a1_Results_64_bytes_1[59]; - PlcInputs._12a1_Results_64_bytes_1[60] := HwInputs._12a1_Results_64_bytes_1[60]; - PlcInputs._12a1_Results_64_bytes_1[61] := HwInputs._12a1_Results_64_bytes_1[61]; - PlcInputs._12a1_Results_64_bytes_1[62] := HwInputs._12a1_Results_64_bytes_1[62]; - PlcInputs._12a1_Results_64_bytes_1[63] := HwInputs._12a1_Results_64_bytes_1[63]; - PlcInputs._12a1_Results_64_bytes_1[64] := HwInputs._12a1_Results_64_bytes_1[64]; - PlcInputs._12a1_Results_64_bytes_1[65] := HwInputs._12a1_Results_64_bytes_1[65]; - PlcInputs._12a1_Results_64_bytes_1[66] := HwInputs._12a1_Results_64_bytes_1[66]; - PlcInputs._12a1_Results_64_bytes_1[67] := HwInputs._12a1_Results_64_bytes_1[67]; - PlcInputs._10a1_Acquisition_Status_1[0] := HwInputs._10a1_Acquisition_Status_1[0]; - PlcInputs._10a1_Acquisition_Status_1[1] := HwInputs._10a1_Acquisition_Status_1[1]; - PlcInputs._10a1_Acquisition_Status_1[2] := HwInputs._10a1_Acquisition_Status_1[2]; - PlcInputs._10a1_Results_Status_1 := HwInputs._10a1_Results_Status_1; - PlcInputs._10a1_Soft_Event_Control_1 := HwInputs._10a1_Soft_Event_Control_1; - PlcInputs._10a1_Result_Data_128_bytes_1[0] := HwInputs._10a1_Result_Data_128_bytes_1[0]; - PlcInputs._10a1_Result_Data_128_bytes_1[1] := HwInputs._10a1_Result_Data_128_bytes_1[1]; - PlcInputs._10a1_Result_Data_128_bytes_1[2] := HwInputs._10a1_Result_Data_128_bytes_1[2]; - PlcInputs._10a1_Result_Data_128_bytes_1[3] := HwInputs._10a1_Result_Data_128_bytes_1[3]; - PlcInputs._10a1_Result_Data_128_bytes_1[4] := HwInputs._10a1_Result_Data_128_bytes_1[4]; - PlcInputs._10a1_Result_Data_128_bytes_1[5] := HwInputs._10a1_Result_Data_128_bytes_1[5]; - PlcInputs._10a1_Result_Data_128_bytes_1[6] := HwInputs._10a1_Result_Data_128_bytes_1[6]; - PlcInputs._10a1_Result_Data_128_bytes_1[7] := HwInputs._10a1_Result_Data_128_bytes_1[7]; - PlcInputs._10a1_Result_Data_128_bytes_1[8] := HwInputs._10a1_Result_Data_128_bytes_1[8]; - PlcInputs._10a1_Result_Data_128_bytes_1[9] := HwInputs._10a1_Result_Data_128_bytes_1[9]; - PlcInputs._10a1_Result_Data_128_bytes_1[10] := HwInputs._10a1_Result_Data_128_bytes_1[10]; - PlcInputs._10a1_Result_Data_128_bytes_1[11] := HwInputs._10a1_Result_Data_128_bytes_1[11]; - PlcInputs._10a1_Result_Data_128_bytes_1[12] := HwInputs._10a1_Result_Data_128_bytes_1[12]; - PlcInputs._10a1_Result_Data_128_bytes_1[13] := HwInputs._10a1_Result_Data_128_bytes_1[13]; - PlcInputs._10a1_Result_Data_128_bytes_1[14] := HwInputs._10a1_Result_Data_128_bytes_1[14]; - PlcInputs._10a1_Result_Data_128_bytes_1[15] := HwInputs._10a1_Result_Data_128_bytes_1[15]; - PlcInputs._10a1_Result_Data_128_bytes_1[16] := HwInputs._10a1_Result_Data_128_bytes_1[16]; - PlcInputs._10a1_Result_Data_128_bytes_1[17] := HwInputs._10a1_Result_Data_128_bytes_1[17]; - PlcInputs._10a1_Result_Data_128_bytes_1[18] := HwInputs._10a1_Result_Data_128_bytes_1[18]; - PlcInputs._10a1_Result_Data_128_bytes_1[19] := HwInputs._10a1_Result_Data_128_bytes_1[19]; - PlcInputs._10a1_Result_Data_128_bytes_1[20] := HwInputs._10a1_Result_Data_128_bytes_1[20]; - PlcInputs._10a1_Result_Data_128_bytes_1[21] := HwInputs._10a1_Result_Data_128_bytes_1[21]; - PlcInputs._10a1_Result_Data_128_bytes_1[22] := HwInputs._10a1_Result_Data_128_bytes_1[22]; - PlcInputs._10a1_Result_Data_128_bytes_1[23] := HwInputs._10a1_Result_Data_128_bytes_1[23]; - PlcInputs._10a1_Result_Data_128_bytes_1[24] := HwInputs._10a1_Result_Data_128_bytes_1[24]; - PlcInputs._10a1_Result_Data_128_bytes_1[25] := HwInputs._10a1_Result_Data_128_bytes_1[25]; - PlcInputs._10a1_Result_Data_128_bytes_1[26] := HwInputs._10a1_Result_Data_128_bytes_1[26]; - PlcInputs._10a1_Result_Data_128_bytes_1[27] := HwInputs._10a1_Result_Data_128_bytes_1[27]; - PlcInputs._10a1_Result_Data_128_bytes_1[28] := HwInputs._10a1_Result_Data_128_bytes_1[28]; - PlcInputs._10a1_Result_Data_128_bytes_1[29] := HwInputs._10a1_Result_Data_128_bytes_1[29]; - PlcInputs._10a1_Result_Data_128_bytes_1[30] := HwInputs._10a1_Result_Data_128_bytes_1[30]; - PlcInputs._10a1_Result_Data_128_bytes_1[31] := HwInputs._10a1_Result_Data_128_bytes_1[31]; - PlcInputs._10a1_Result_Data_128_bytes_1[32] := HwInputs._10a1_Result_Data_128_bytes_1[32]; - PlcInputs._10a1_Result_Data_128_bytes_1[33] := HwInputs._10a1_Result_Data_128_bytes_1[33]; - PlcInputs._10a1_Result_Data_128_bytes_1[34] := HwInputs._10a1_Result_Data_128_bytes_1[34]; - PlcInputs._10a1_Result_Data_128_bytes_1[35] := HwInputs._10a1_Result_Data_128_bytes_1[35]; - PlcInputs._10a1_Result_Data_128_bytes_1[36] := HwInputs._10a1_Result_Data_128_bytes_1[36]; - PlcInputs._10a1_Result_Data_128_bytes_1[37] := HwInputs._10a1_Result_Data_128_bytes_1[37]; - PlcInputs._10a1_Result_Data_128_bytes_1[38] := HwInputs._10a1_Result_Data_128_bytes_1[38]; - PlcInputs._10a1_Result_Data_128_bytes_1[39] := HwInputs._10a1_Result_Data_128_bytes_1[39]; - PlcInputs._10a1_Result_Data_128_bytes_1[40] := HwInputs._10a1_Result_Data_128_bytes_1[40]; - PlcInputs._10a1_Result_Data_128_bytes_1[41] := HwInputs._10a1_Result_Data_128_bytes_1[41]; - PlcInputs._10a1_Result_Data_128_bytes_1[42] := HwInputs._10a1_Result_Data_128_bytes_1[42]; - PlcInputs._10a1_Result_Data_128_bytes_1[43] := HwInputs._10a1_Result_Data_128_bytes_1[43]; - PlcInputs._10a1_Result_Data_128_bytes_1[44] := HwInputs._10a1_Result_Data_128_bytes_1[44]; - PlcInputs._10a1_Result_Data_128_bytes_1[45] := HwInputs._10a1_Result_Data_128_bytes_1[45]; - PlcInputs._10a1_Result_Data_128_bytes_1[46] := HwInputs._10a1_Result_Data_128_bytes_1[46]; - PlcInputs._10a1_Result_Data_128_bytes_1[47] := HwInputs._10a1_Result_Data_128_bytes_1[47]; - PlcInputs._10a1_Result_Data_128_bytes_1[48] := HwInputs._10a1_Result_Data_128_bytes_1[48]; - PlcInputs._10a1_Result_Data_128_bytes_1[49] := HwInputs._10a1_Result_Data_128_bytes_1[49]; - PlcInputs._10a1_Result_Data_128_bytes_1[50] := HwInputs._10a1_Result_Data_128_bytes_1[50]; - PlcInputs._10a1_Result_Data_128_bytes_1[51] := HwInputs._10a1_Result_Data_128_bytes_1[51]; - PlcInputs._10a1_Result_Data_128_bytes_1[52] := HwInputs._10a1_Result_Data_128_bytes_1[52]; - PlcInputs._10a1_Result_Data_128_bytes_1[53] := HwInputs._10a1_Result_Data_128_bytes_1[53]; - PlcInputs._10a1_Result_Data_128_bytes_1[54] := HwInputs._10a1_Result_Data_128_bytes_1[54]; - PlcInputs._10a1_Result_Data_128_bytes_1[55] := HwInputs._10a1_Result_Data_128_bytes_1[55]; - PlcInputs._10a1_Result_Data_128_bytes_1[56] := HwInputs._10a1_Result_Data_128_bytes_1[56]; - PlcInputs._10a1_Result_Data_128_bytes_1[57] := HwInputs._10a1_Result_Data_128_bytes_1[57]; - PlcInputs._10a1_Result_Data_128_bytes_1[58] := HwInputs._10a1_Result_Data_128_bytes_1[58]; - PlcInputs._10a1_Result_Data_128_bytes_1[59] := HwInputs._10a1_Result_Data_128_bytes_1[59]; - PlcInputs._10a1_Result_Data_128_bytes_1[60] := HwInputs._10a1_Result_Data_128_bytes_1[60]; - PlcInputs._10a1_Result_Data_128_bytes_1[61] := HwInputs._10a1_Result_Data_128_bytes_1[61]; - PlcInputs._10a1_Result_Data_128_bytes_1[62] := HwInputs._10a1_Result_Data_128_bytes_1[62]; - PlcInputs._10a1_Result_Data_128_bytes_1[63] := HwInputs._10a1_Result_Data_128_bytes_1[63]; - PlcInputs._10a1_Result_Data_128_bytes_1[64] := HwInputs._10a1_Result_Data_128_bytes_1[64]; - PlcInputs._10a1_Result_Data_128_bytes_1[65] := HwInputs._10a1_Result_Data_128_bytes_1[65]; - PlcInputs._10a1_Result_Data_128_bytes_1[66] := HwInputs._10a1_Result_Data_128_bytes_1[66]; - PlcInputs._10a1_Result_Data_128_bytes_1[67] := HwInputs._10a1_Result_Data_128_bytes_1[67]; - PlcInputs._10a1_Result_Data_128_bytes_1[68] := HwInputs._10a1_Result_Data_128_bytes_1[68]; - PlcInputs._10a1_Result_Data_128_bytes_1[69] := HwInputs._10a1_Result_Data_128_bytes_1[69]; - PlcInputs._10a1_Result_Data_128_bytes_1[70] := HwInputs._10a1_Result_Data_128_bytes_1[70]; - PlcInputs._10a1_Result_Data_128_bytes_1[71] := HwInputs._10a1_Result_Data_128_bytes_1[71]; - PlcInputs._10a1_Result_Data_128_bytes_1[72] := HwInputs._10a1_Result_Data_128_bytes_1[72]; - PlcInputs._10a1_Result_Data_128_bytes_1[73] := HwInputs._10a1_Result_Data_128_bytes_1[73]; - PlcInputs._10a1_Result_Data_128_bytes_1[74] := HwInputs._10a1_Result_Data_128_bytes_1[74]; - PlcInputs._10a1_Result_Data_128_bytes_1[75] := HwInputs._10a1_Result_Data_128_bytes_1[75]; - PlcInputs._10a1_Result_Data_128_bytes_1[76] := HwInputs._10a1_Result_Data_128_bytes_1[76]; - PlcInputs._10a1_Result_Data_128_bytes_1[77] := HwInputs._10a1_Result_Data_128_bytes_1[77]; - PlcInputs._10a1_Result_Data_128_bytes_1[78] := HwInputs._10a1_Result_Data_128_bytes_1[78]; - PlcInputs._10a1_Result_Data_128_bytes_1[79] := HwInputs._10a1_Result_Data_128_bytes_1[79]; - PlcInputs._10a1_Result_Data_128_bytes_1[80] := HwInputs._10a1_Result_Data_128_bytes_1[80]; - PlcInputs._10a1_Result_Data_128_bytes_1[81] := HwInputs._10a1_Result_Data_128_bytes_1[81]; - PlcInputs._10a1_Result_Data_128_bytes_1[82] := HwInputs._10a1_Result_Data_128_bytes_1[82]; - PlcInputs._10a1_Result_Data_128_bytes_1[83] := HwInputs._10a1_Result_Data_128_bytes_1[83]; - PlcInputs._10a1_Result_Data_128_bytes_1[84] := HwInputs._10a1_Result_Data_128_bytes_1[84]; - PlcInputs._10a1_Result_Data_128_bytes_1[85] := HwInputs._10a1_Result_Data_128_bytes_1[85]; - PlcInputs._10a1_Result_Data_128_bytes_1[86] := HwInputs._10a1_Result_Data_128_bytes_1[86]; - PlcInputs._10a1_Result_Data_128_bytes_1[87] := HwInputs._10a1_Result_Data_128_bytes_1[87]; - PlcInputs._10a1_Result_Data_128_bytes_1[88] := HwInputs._10a1_Result_Data_128_bytes_1[88]; - PlcInputs._10a1_Result_Data_128_bytes_1[89] := HwInputs._10a1_Result_Data_128_bytes_1[89]; - PlcInputs._10a1_Result_Data_128_bytes_1[90] := HwInputs._10a1_Result_Data_128_bytes_1[90]; - PlcInputs._10a1_Result_Data_128_bytes_1[91] := HwInputs._10a1_Result_Data_128_bytes_1[91]; - PlcInputs._10a1_Result_Data_128_bytes_1[92] := HwInputs._10a1_Result_Data_128_bytes_1[92]; - PlcInputs._10a1_Result_Data_128_bytes_1[93] := HwInputs._10a1_Result_Data_128_bytes_1[93]; - PlcInputs._10a1_Result_Data_128_bytes_1[94] := HwInputs._10a1_Result_Data_128_bytes_1[94]; - PlcInputs._10a1_Result_Data_128_bytes_1[95] := HwInputs._10a1_Result_Data_128_bytes_1[95]; - PlcInputs._10a1_Result_Data_128_bytes_1[96] := HwInputs._10a1_Result_Data_128_bytes_1[96]; - PlcInputs._10a1_Result_Data_128_bytes_1[97] := HwInputs._10a1_Result_Data_128_bytes_1[97]; - PlcInputs._10a1_Result_Data_128_bytes_1[98] := HwInputs._10a1_Result_Data_128_bytes_1[98]; - PlcInputs._10a1_Result_Data_128_bytes_1[99] := HwInputs._10a1_Result_Data_128_bytes_1[99]; - PlcInputs._10a1_Result_Data_128_bytes_1[100] := HwInputs._10a1_Result_Data_128_bytes_1[100]; - PlcInputs._10a1_Result_Data_128_bytes_1[101] := HwInputs._10a1_Result_Data_128_bytes_1[101]; - PlcInputs._10a1_Result_Data_128_bytes_1[102] := HwInputs._10a1_Result_Data_128_bytes_1[102]; - PlcInputs._10a1_Result_Data_128_bytes_1[103] := HwInputs._10a1_Result_Data_128_bytes_1[103]; - PlcInputs._10a1_Result_Data_128_bytes_1[104] := HwInputs._10a1_Result_Data_128_bytes_1[104]; - PlcInputs._10a1_Result_Data_128_bytes_1[105] := HwInputs._10a1_Result_Data_128_bytes_1[105]; - PlcInputs._10a1_Result_Data_128_bytes_1[106] := HwInputs._10a1_Result_Data_128_bytes_1[106]; - PlcInputs._10a1_Result_Data_128_bytes_1[107] := HwInputs._10a1_Result_Data_128_bytes_1[107]; - PlcInputs._10a1_Result_Data_128_bytes_1[108] := HwInputs._10a1_Result_Data_128_bytes_1[108]; - PlcInputs._10a1_Result_Data_128_bytes_1[109] := HwInputs._10a1_Result_Data_128_bytes_1[109]; - PlcInputs._10a1_Result_Data_128_bytes_1[110] := HwInputs._10a1_Result_Data_128_bytes_1[110]; - PlcInputs._10a1_Result_Data_128_bytes_1[111] := HwInputs._10a1_Result_Data_128_bytes_1[111]; - PlcInputs._10a1_Result_Data_128_bytes_1[112] := HwInputs._10a1_Result_Data_128_bytes_1[112]; - PlcInputs._10a1_Result_Data_128_bytes_1[113] := HwInputs._10a1_Result_Data_128_bytes_1[113]; - PlcInputs._10a1_Result_Data_128_bytes_1[114] := HwInputs._10a1_Result_Data_128_bytes_1[114]; - PlcInputs._10a1_Result_Data_128_bytes_1[115] := HwInputs._10a1_Result_Data_128_bytes_1[115]; - PlcInputs._10a1_Result_Data_128_bytes_1[116] := HwInputs._10a1_Result_Data_128_bytes_1[116]; - PlcInputs._10a1_Result_Data_128_bytes_1[117] := HwInputs._10a1_Result_Data_128_bytes_1[117]; - PlcInputs._10a1_Result_Data_128_bytes_1[118] := HwInputs._10a1_Result_Data_128_bytes_1[118]; - PlcInputs._10a1_Result_Data_128_bytes_1[119] := HwInputs._10a1_Result_Data_128_bytes_1[119]; - PlcInputs._10a1_Result_Data_128_bytes_1[120] := HwInputs._10a1_Result_Data_128_bytes_1[120]; - PlcInputs._10a1_Result_Data_128_bytes_1[121] := HwInputs._10a1_Result_Data_128_bytes_1[121]; - PlcInputs._10a1_Result_Data_128_bytes_1[122] := HwInputs._10a1_Result_Data_128_bytes_1[122]; - PlcInputs._10a1_Result_Data_128_bytes_1[123] := HwInputs._10a1_Result_Data_128_bytes_1[123]; - PlcInputs._10a1_Result_Data_128_bytes_1[124] := HwInputs._10a1_Result_Data_128_bytes_1[124]; - PlcInputs._10a1_Result_Data_128_bytes_1[125] := HwInputs._10a1_Result_Data_128_bytes_1[125]; - PlcInputs._10a1_Result_Data_128_bytes_1[126] := HwInputs._10a1_Result_Data_128_bytes_1[126]; - PlcInputs._10a1_Result_Data_128_bytes_1[127] := HwInputs._10a1_Result_Data_128_bytes_1[127]; - PlcInputs._10a1_Result_Data_128_bytes_1[128] := HwInputs._10a1_Result_Data_128_bytes_1[128]; - PlcInputs._10a1_Result_Data_128_bytes_1[129] := HwInputs._10a1_Result_Data_128_bytes_1[129]; - PlcInputs._10a1_Result_Data_128_bytes_1[130] := HwInputs._10a1_Result_Data_128_bytes_1[130]; - PlcInputs._10a1_Result_Data_128_bytes_1[131] := HwInputs._10a1_Result_Data_128_bytes_1[131]; - PlcInputs._10a1_Result_Data_128_bytes_1[132] := HwInputs._10a1_Result_Data_128_bytes_1[132]; - PlcInputs._10a1_Result_Data_128_bytes_1[133] := HwInputs._10a1_Result_Data_128_bytes_1[133]; - PlcInputs._10a1_Result_Data_128_bytes_1[134] := HwInputs._10a1_Result_Data_128_bytes_1[134]; - PlcInputs._10a1_Result_Data_128_bytes_1[135] := HwInputs._10a1_Result_Data_128_bytes_1[135]; -END_FUNCTION diff --git a/Export/PLC_1/CopyOutputs.st b/Export/PLC_1/CopyOutputs.st deleted file mode 100644 index caf897994..000000000 --- a/Export/PLC_1/CopyOutputs.st +++ /dev/null @@ -1,210 +0,0 @@ -FUNCTION CopyOutputs - VAR_EXTERNAL - HwOutputs : HwOutputs; - PlcOutputs : PlcOutputs; - END_VAR - HwOutputs._11a1_DQ_8x24VDC_0_5A_ST_1 := PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1; - HwOutputs._12a1_Acquisition_Control_1 := PlcOutputs._12a1_Acquisition_Control_1; - HwOutputs._12a1_Inspection_Control_1 := PlcOutputs._12a1_Inspection_Control_1; - HwOutputs._12a1_Command_Control_1 := PlcOutputs._12a1_Command_Control_1; - HwOutputs._12a1_SoftEvent_Control_1 := PlcOutputs._12a1_SoftEvent_Control_1; - HwOutputs._12a1_User_Data_64_bytes_1[0] := PlcOutputs._12a1_User_Data_64_bytes_1[0]; - HwOutputs._12a1_User_Data_64_bytes_1[1] := PlcOutputs._12a1_User_Data_64_bytes_1[1]; - HwOutputs._12a1_User_Data_64_bytes_1[2] := PlcOutputs._12a1_User_Data_64_bytes_1[2]; - HwOutputs._12a1_User_Data_64_bytes_1[3] := PlcOutputs._12a1_User_Data_64_bytes_1[3]; - HwOutputs._12a1_User_Data_64_bytes_1[4] := PlcOutputs._12a1_User_Data_64_bytes_1[4]; - HwOutputs._12a1_User_Data_64_bytes_1[5] := PlcOutputs._12a1_User_Data_64_bytes_1[5]; - HwOutputs._12a1_User_Data_64_bytes_1[6] := PlcOutputs._12a1_User_Data_64_bytes_1[6]; - HwOutputs._12a1_User_Data_64_bytes_1[7] := PlcOutputs._12a1_User_Data_64_bytes_1[7]; - HwOutputs._12a1_User_Data_64_bytes_1[8] := PlcOutputs._12a1_User_Data_64_bytes_1[8]; - HwOutputs._12a1_User_Data_64_bytes_1[9] := PlcOutputs._12a1_User_Data_64_bytes_1[9]; - HwOutputs._12a1_User_Data_64_bytes_1[10] := PlcOutputs._12a1_User_Data_64_bytes_1[10]; - HwOutputs._12a1_User_Data_64_bytes_1[11] := PlcOutputs._12a1_User_Data_64_bytes_1[11]; - HwOutputs._12a1_User_Data_64_bytes_1[12] := PlcOutputs._12a1_User_Data_64_bytes_1[12]; - HwOutputs._12a1_User_Data_64_bytes_1[13] := PlcOutputs._12a1_User_Data_64_bytes_1[13]; - HwOutputs._12a1_User_Data_64_bytes_1[14] := PlcOutputs._12a1_User_Data_64_bytes_1[14]; - HwOutputs._12a1_User_Data_64_bytes_1[15] := PlcOutputs._12a1_User_Data_64_bytes_1[15]; - HwOutputs._12a1_User_Data_64_bytes_1[16] := PlcOutputs._12a1_User_Data_64_bytes_1[16]; - HwOutputs._12a1_User_Data_64_bytes_1[17] := PlcOutputs._12a1_User_Data_64_bytes_1[17]; - HwOutputs._12a1_User_Data_64_bytes_1[18] := PlcOutputs._12a1_User_Data_64_bytes_1[18]; - HwOutputs._12a1_User_Data_64_bytes_1[19] := PlcOutputs._12a1_User_Data_64_bytes_1[19]; - HwOutputs._12a1_User_Data_64_bytes_1[20] := PlcOutputs._12a1_User_Data_64_bytes_1[20]; - HwOutputs._12a1_User_Data_64_bytes_1[21] := PlcOutputs._12a1_User_Data_64_bytes_1[21]; - HwOutputs._12a1_User_Data_64_bytes_1[22] := PlcOutputs._12a1_User_Data_64_bytes_1[22]; - HwOutputs._12a1_User_Data_64_bytes_1[23] := PlcOutputs._12a1_User_Data_64_bytes_1[23]; - HwOutputs._12a1_User_Data_64_bytes_1[24] := PlcOutputs._12a1_User_Data_64_bytes_1[24]; - HwOutputs._12a1_User_Data_64_bytes_1[25] := PlcOutputs._12a1_User_Data_64_bytes_1[25]; - HwOutputs._12a1_User_Data_64_bytes_1[26] := PlcOutputs._12a1_User_Data_64_bytes_1[26]; - HwOutputs._12a1_User_Data_64_bytes_1[27] := PlcOutputs._12a1_User_Data_64_bytes_1[27]; - HwOutputs._12a1_User_Data_64_bytes_1[28] := PlcOutputs._12a1_User_Data_64_bytes_1[28]; - HwOutputs._12a1_User_Data_64_bytes_1[29] := PlcOutputs._12a1_User_Data_64_bytes_1[29]; - HwOutputs._12a1_User_Data_64_bytes_1[30] := PlcOutputs._12a1_User_Data_64_bytes_1[30]; - HwOutputs._12a1_User_Data_64_bytes_1[31] := PlcOutputs._12a1_User_Data_64_bytes_1[31]; - HwOutputs._12a1_User_Data_64_bytes_1[32] := PlcOutputs._12a1_User_Data_64_bytes_1[32]; - HwOutputs._12a1_User_Data_64_bytes_1[33] := PlcOutputs._12a1_User_Data_64_bytes_1[33]; - HwOutputs._12a1_User_Data_64_bytes_1[34] := PlcOutputs._12a1_User_Data_64_bytes_1[34]; - HwOutputs._12a1_User_Data_64_bytes_1[35] := PlcOutputs._12a1_User_Data_64_bytes_1[35]; - HwOutputs._12a1_User_Data_64_bytes_1[36] := PlcOutputs._12a1_User_Data_64_bytes_1[36]; - HwOutputs._12a1_User_Data_64_bytes_1[37] := PlcOutputs._12a1_User_Data_64_bytes_1[37]; - HwOutputs._12a1_User_Data_64_bytes_1[38] := PlcOutputs._12a1_User_Data_64_bytes_1[38]; - HwOutputs._12a1_User_Data_64_bytes_1[39] := PlcOutputs._12a1_User_Data_64_bytes_1[39]; - HwOutputs._12a1_User_Data_64_bytes_1[40] := PlcOutputs._12a1_User_Data_64_bytes_1[40]; - HwOutputs._12a1_User_Data_64_bytes_1[41] := PlcOutputs._12a1_User_Data_64_bytes_1[41]; - HwOutputs._12a1_User_Data_64_bytes_1[42] := PlcOutputs._12a1_User_Data_64_bytes_1[42]; - HwOutputs._12a1_User_Data_64_bytes_1[43] := PlcOutputs._12a1_User_Data_64_bytes_1[43]; - HwOutputs._12a1_User_Data_64_bytes_1[44] := PlcOutputs._12a1_User_Data_64_bytes_1[44]; - HwOutputs._12a1_User_Data_64_bytes_1[45] := PlcOutputs._12a1_User_Data_64_bytes_1[45]; - HwOutputs._12a1_User_Data_64_bytes_1[46] := PlcOutputs._12a1_User_Data_64_bytes_1[46]; - HwOutputs._12a1_User_Data_64_bytes_1[47] := PlcOutputs._12a1_User_Data_64_bytes_1[47]; - HwOutputs._12a1_User_Data_64_bytes_1[48] := PlcOutputs._12a1_User_Data_64_bytes_1[48]; - HwOutputs._12a1_User_Data_64_bytes_1[49] := PlcOutputs._12a1_User_Data_64_bytes_1[49]; - HwOutputs._12a1_User_Data_64_bytes_1[50] := PlcOutputs._12a1_User_Data_64_bytes_1[50]; - HwOutputs._12a1_User_Data_64_bytes_1[51] := PlcOutputs._12a1_User_Data_64_bytes_1[51]; - HwOutputs._12a1_User_Data_64_bytes_1[52] := PlcOutputs._12a1_User_Data_64_bytes_1[52]; - HwOutputs._12a1_User_Data_64_bytes_1[53] := PlcOutputs._12a1_User_Data_64_bytes_1[53]; - HwOutputs._12a1_User_Data_64_bytes_1[54] := PlcOutputs._12a1_User_Data_64_bytes_1[54]; - HwOutputs._12a1_User_Data_64_bytes_1[55] := PlcOutputs._12a1_User_Data_64_bytes_1[55]; - HwOutputs._12a1_User_Data_64_bytes_1[56] := PlcOutputs._12a1_User_Data_64_bytes_1[56]; - HwOutputs._12a1_User_Data_64_bytes_1[57] := PlcOutputs._12a1_User_Data_64_bytes_1[57]; - HwOutputs._12a1_User_Data_64_bytes_1[58] := PlcOutputs._12a1_User_Data_64_bytes_1[58]; - HwOutputs._12a1_User_Data_64_bytes_1[59] := PlcOutputs._12a1_User_Data_64_bytes_1[59]; - HwOutputs._12a1_User_Data_64_bytes_1[60] := PlcOutputs._12a1_User_Data_64_bytes_1[60]; - HwOutputs._12a1_User_Data_64_bytes_1[61] := PlcOutputs._12a1_User_Data_64_bytes_1[61]; - HwOutputs._12a1_User_Data_64_bytes_1[62] := PlcOutputs._12a1_User_Data_64_bytes_1[62]; - HwOutputs._12a1_User_Data_64_bytes_1[63] := PlcOutputs._12a1_User_Data_64_bytes_1[63]; - HwOutputs._10a1_Acquisition_Control_1 := PlcOutputs._10a1_Acquisition_Control_1; - HwOutputs._10a1_Results_Control_1 := PlcOutputs._10a1_Results_Control_1; - HwOutputs._10a1_Soft_Event_Control_1 := PlcOutputs._10a1_Soft_Event_Control_1; - HwOutputs._10a1_User_Data_128_bytes_1[0] := PlcOutputs._10a1_User_Data_128_bytes_1[0]; - HwOutputs._10a1_User_Data_128_bytes_1[1] := PlcOutputs._10a1_User_Data_128_bytes_1[1]; - HwOutputs._10a1_User_Data_128_bytes_1[2] := PlcOutputs._10a1_User_Data_128_bytes_1[2]; - HwOutputs._10a1_User_Data_128_bytes_1[3] := PlcOutputs._10a1_User_Data_128_bytes_1[3]; - HwOutputs._10a1_User_Data_128_bytes_1[4] := PlcOutputs._10a1_User_Data_128_bytes_1[4]; - HwOutputs._10a1_User_Data_128_bytes_1[5] := PlcOutputs._10a1_User_Data_128_bytes_1[5]; - HwOutputs._10a1_User_Data_128_bytes_1[6] := PlcOutputs._10a1_User_Data_128_bytes_1[6]; - HwOutputs._10a1_User_Data_128_bytes_1[7] := PlcOutputs._10a1_User_Data_128_bytes_1[7]; - HwOutputs._10a1_User_Data_128_bytes_1[8] := PlcOutputs._10a1_User_Data_128_bytes_1[8]; - HwOutputs._10a1_User_Data_128_bytes_1[9] := PlcOutputs._10a1_User_Data_128_bytes_1[9]; - HwOutputs._10a1_User_Data_128_bytes_1[10] := PlcOutputs._10a1_User_Data_128_bytes_1[10]; - HwOutputs._10a1_User_Data_128_bytes_1[11] := PlcOutputs._10a1_User_Data_128_bytes_1[11]; - HwOutputs._10a1_User_Data_128_bytes_1[12] := PlcOutputs._10a1_User_Data_128_bytes_1[12]; - HwOutputs._10a1_User_Data_128_bytes_1[13] := PlcOutputs._10a1_User_Data_128_bytes_1[13]; - HwOutputs._10a1_User_Data_128_bytes_1[14] := PlcOutputs._10a1_User_Data_128_bytes_1[14]; - HwOutputs._10a1_User_Data_128_bytes_1[15] := PlcOutputs._10a1_User_Data_128_bytes_1[15]; - HwOutputs._10a1_User_Data_128_bytes_1[16] := PlcOutputs._10a1_User_Data_128_bytes_1[16]; - HwOutputs._10a1_User_Data_128_bytes_1[17] := PlcOutputs._10a1_User_Data_128_bytes_1[17]; - HwOutputs._10a1_User_Data_128_bytes_1[18] := PlcOutputs._10a1_User_Data_128_bytes_1[18]; - HwOutputs._10a1_User_Data_128_bytes_1[19] := PlcOutputs._10a1_User_Data_128_bytes_1[19]; - HwOutputs._10a1_User_Data_128_bytes_1[20] := PlcOutputs._10a1_User_Data_128_bytes_1[20]; - HwOutputs._10a1_User_Data_128_bytes_1[21] := PlcOutputs._10a1_User_Data_128_bytes_1[21]; - HwOutputs._10a1_User_Data_128_bytes_1[22] := PlcOutputs._10a1_User_Data_128_bytes_1[22]; - HwOutputs._10a1_User_Data_128_bytes_1[23] := PlcOutputs._10a1_User_Data_128_bytes_1[23]; - HwOutputs._10a1_User_Data_128_bytes_1[24] := PlcOutputs._10a1_User_Data_128_bytes_1[24]; - HwOutputs._10a1_User_Data_128_bytes_1[25] := PlcOutputs._10a1_User_Data_128_bytes_1[25]; - HwOutputs._10a1_User_Data_128_bytes_1[26] := PlcOutputs._10a1_User_Data_128_bytes_1[26]; - HwOutputs._10a1_User_Data_128_bytes_1[27] := PlcOutputs._10a1_User_Data_128_bytes_1[27]; - HwOutputs._10a1_User_Data_128_bytes_1[28] := PlcOutputs._10a1_User_Data_128_bytes_1[28]; - HwOutputs._10a1_User_Data_128_bytes_1[29] := PlcOutputs._10a1_User_Data_128_bytes_1[29]; - HwOutputs._10a1_User_Data_128_bytes_1[30] := PlcOutputs._10a1_User_Data_128_bytes_1[30]; - HwOutputs._10a1_User_Data_128_bytes_1[31] := PlcOutputs._10a1_User_Data_128_bytes_1[31]; - HwOutputs._10a1_User_Data_128_bytes_1[32] := PlcOutputs._10a1_User_Data_128_bytes_1[32]; - HwOutputs._10a1_User_Data_128_bytes_1[33] := PlcOutputs._10a1_User_Data_128_bytes_1[33]; - HwOutputs._10a1_User_Data_128_bytes_1[34] := PlcOutputs._10a1_User_Data_128_bytes_1[34]; - HwOutputs._10a1_User_Data_128_bytes_1[35] := PlcOutputs._10a1_User_Data_128_bytes_1[35]; - HwOutputs._10a1_User_Data_128_bytes_1[36] := PlcOutputs._10a1_User_Data_128_bytes_1[36]; - HwOutputs._10a1_User_Data_128_bytes_1[37] := PlcOutputs._10a1_User_Data_128_bytes_1[37]; - HwOutputs._10a1_User_Data_128_bytes_1[38] := PlcOutputs._10a1_User_Data_128_bytes_1[38]; - HwOutputs._10a1_User_Data_128_bytes_1[39] := PlcOutputs._10a1_User_Data_128_bytes_1[39]; - HwOutputs._10a1_User_Data_128_bytes_1[40] := PlcOutputs._10a1_User_Data_128_bytes_1[40]; - HwOutputs._10a1_User_Data_128_bytes_1[41] := PlcOutputs._10a1_User_Data_128_bytes_1[41]; - HwOutputs._10a1_User_Data_128_bytes_1[42] := PlcOutputs._10a1_User_Data_128_bytes_1[42]; - HwOutputs._10a1_User_Data_128_bytes_1[43] := PlcOutputs._10a1_User_Data_128_bytes_1[43]; - HwOutputs._10a1_User_Data_128_bytes_1[44] := PlcOutputs._10a1_User_Data_128_bytes_1[44]; - HwOutputs._10a1_User_Data_128_bytes_1[45] := PlcOutputs._10a1_User_Data_128_bytes_1[45]; - HwOutputs._10a1_User_Data_128_bytes_1[46] := PlcOutputs._10a1_User_Data_128_bytes_1[46]; - HwOutputs._10a1_User_Data_128_bytes_1[47] := PlcOutputs._10a1_User_Data_128_bytes_1[47]; - HwOutputs._10a1_User_Data_128_bytes_1[48] := PlcOutputs._10a1_User_Data_128_bytes_1[48]; - HwOutputs._10a1_User_Data_128_bytes_1[49] := PlcOutputs._10a1_User_Data_128_bytes_1[49]; - HwOutputs._10a1_User_Data_128_bytes_1[50] := PlcOutputs._10a1_User_Data_128_bytes_1[50]; - HwOutputs._10a1_User_Data_128_bytes_1[51] := PlcOutputs._10a1_User_Data_128_bytes_1[51]; - HwOutputs._10a1_User_Data_128_bytes_1[52] := PlcOutputs._10a1_User_Data_128_bytes_1[52]; - HwOutputs._10a1_User_Data_128_bytes_1[53] := PlcOutputs._10a1_User_Data_128_bytes_1[53]; - HwOutputs._10a1_User_Data_128_bytes_1[54] := PlcOutputs._10a1_User_Data_128_bytes_1[54]; - HwOutputs._10a1_User_Data_128_bytes_1[55] := PlcOutputs._10a1_User_Data_128_bytes_1[55]; - HwOutputs._10a1_User_Data_128_bytes_1[56] := PlcOutputs._10a1_User_Data_128_bytes_1[56]; - HwOutputs._10a1_User_Data_128_bytes_1[57] := PlcOutputs._10a1_User_Data_128_bytes_1[57]; - HwOutputs._10a1_User_Data_128_bytes_1[58] := PlcOutputs._10a1_User_Data_128_bytes_1[58]; - HwOutputs._10a1_User_Data_128_bytes_1[59] := PlcOutputs._10a1_User_Data_128_bytes_1[59]; - HwOutputs._10a1_User_Data_128_bytes_1[60] := PlcOutputs._10a1_User_Data_128_bytes_1[60]; - HwOutputs._10a1_User_Data_128_bytes_1[61] := PlcOutputs._10a1_User_Data_128_bytes_1[61]; - HwOutputs._10a1_User_Data_128_bytes_1[62] := PlcOutputs._10a1_User_Data_128_bytes_1[62]; - HwOutputs._10a1_User_Data_128_bytes_1[63] := PlcOutputs._10a1_User_Data_128_bytes_1[63]; - HwOutputs._10a1_User_Data_128_bytes_1[64] := PlcOutputs._10a1_User_Data_128_bytes_1[64]; - HwOutputs._10a1_User_Data_128_bytes_1[65] := PlcOutputs._10a1_User_Data_128_bytes_1[65]; - HwOutputs._10a1_User_Data_128_bytes_1[66] := PlcOutputs._10a1_User_Data_128_bytes_1[66]; - HwOutputs._10a1_User_Data_128_bytes_1[67] := PlcOutputs._10a1_User_Data_128_bytes_1[67]; - HwOutputs._10a1_User_Data_128_bytes_1[68] := PlcOutputs._10a1_User_Data_128_bytes_1[68]; - HwOutputs._10a1_User_Data_128_bytes_1[69] := PlcOutputs._10a1_User_Data_128_bytes_1[69]; - HwOutputs._10a1_User_Data_128_bytes_1[70] := PlcOutputs._10a1_User_Data_128_bytes_1[70]; - HwOutputs._10a1_User_Data_128_bytes_1[71] := PlcOutputs._10a1_User_Data_128_bytes_1[71]; - HwOutputs._10a1_User_Data_128_bytes_1[72] := PlcOutputs._10a1_User_Data_128_bytes_1[72]; - HwOutputs._10a1_User_Data_128_bytes_1[73] := PlcOutputs._10a1_User_Data_128_bytes_1[73]; - HwOutputs._10a1_User_Data_128_bytes_1[74] := PlcOutputs._10a1_User_Data_128_bytes_1[74]; - HwOutputs._10a1_User_Data_128_bytes_1[75] := PlcOutputs._10a1_User_Data_128_bytes_1[75]; - HwOutputs._10a1_User_Data_128_bytes_1[76] := PlcOutputs._10a1_User_Data_128_bytes_1[76]; - HwOutputs._10a1_User_Data_128_bytes_1[77] := PlcOutputs._10a1_User_Data_128_bytes_1[77]; - HwOutputs._10a1_User_Data_128_bytes_1[78] := PlcOutputs._10a1_User_Data_128_bytes_1[78]; - HwOutputs._10a1_User_Data_128_bytes_1[79] := PlcOutputs._10a1_User_Data_128_bytes_1[79]; - HwOutputs._10a1_User_Data_128_bytes_1[80] := PlcOutputs._10a1_User_Data_128_bytes_1[80]; - HwOutputs._10a1_User_Data_128_bytes_1[81] := PlcOutputs._10a1_User_Data_128_bytes_1[81]; - HwOutputs._10a1_User_Data_128_bytes_1[82] := PlcOutputs._10a1_User_Data_128_bytes_1[82]; - HwOutputs._10a1_User_Data_128_bytes_1[83] := PlcOutputs._10a1_User_Data_128_bytes_1[83]; - HwOutputs._10a1_User_Data_128_bytes_1[84] := PlcOutputs._10a1_User_Data_128_bytes_1[84]; - HwOutputs._10a1_User_Data_128_bytes_1[85] := PlcOutputs._10a1_User_Data_128_bytes_1[85]; - HwOutputs._10a1_User_Data_128_bytes_1[86] := PlcOutputs._10a1_User_Data_128_bytes_1[86]; - HwOutputs._10a1_User_Data_128_bytes_1[87] := PlcOutputs._10a1_User_Data_128_bytes_1[87]; - HwOutputs._10a1_User_Data_128_bytes_1[88] := PlcOutputs._10a1_User_Data_128_bytes_1[88]; - HwOutputs._10a1_User_Data_128_bytes_1[89] := PlcOutputs._10a1_User_Data_128_bytes_1[89]; - HwOutputs._10a1_User_Data_128_bytes_1[90] := PlcOutputs._10a1_User_Data_128_bytes_1[90]; - HwOutputs._10a1_User_Data_128_bytes_1[91] := PlcOutputs._10a1_User_Data_128_bytes_1[91]; - HwOutputs._10a1_User_Data_128_bytes_1[92] := PlcOutputs._10a1_User_Data_128_bytes_1[92]; - HwOutputs._10a1_User_Data_128_bytes_1[93] := PlcOutputs._10a1_User_Data_128_bytes_1[93]; - HwOutputs._10a1_User_Data_128_bytes_1[94] := PlcOutputs._10a1_User_Data_128_bytes_1[94]; - HwOutputs._10a1_User_Data_128_bytes_1[95] := PlcOutputs._10a1_User_Data_128_bytes_1[95]; - HwOutputs._10a1_User_Data_128_bytes_1[96] := PlcOutputs._10a1_User_Data_128_bytes_1[96]; - HwOutputs._10a1_User_Data_128_bytes_1[97] := PlcOutputs._10a1_User_Data_128_bytes_1[97]; - HwOutputs._10a1_User_Data_128_bytes_1[98] := PlcOutputs._10a1_User_Data_128_bytes_1[98]; - HwOutputs._10a1_User_Data_128_bytes_1[99] := PlcOutputs._10a1_User_Data_128_bytes_1[99]; - HwOutputs._10a1_User_Data_128_bytes_1[100] := PlcOutputs._10a1_User_Data_128_bytes_1[100]; - HwOutputs._10a1_User_Data_128_bytes_1[101] := PlcOutputs._10a1_User_Data_128_bytes_1[101]; - HwOutputs._10a1_User_Data_128_bytes_1[102] := PlcOutputs._10a1_User_Data_128_bytes_1[102]; - HwOutputs._10a1_User_Data_128_bytes_1[103] := PlcOutputs._10a1_User_Data_128_bytes_1[103]; - HwOutputs._10a1_User_Data_128_bytes_1[104] := PlcOutputs._10a1_User_Data_128_bytes_1[104]; - HwOutputs._10a1_User_Data_128_bytes_1[105] := PlcOutputs._10a1_User_Data_128_bytes_1[105]; - HwOutputs._10a1_User_Data_128_bytes_1[106] := PlcOutputs._10a1_User_Data_128_bytes_1[106]; - HwOutputs._10a1_User_Data_128_bytes_1[107] := PlcOutputs._10a1_User_Data_128_bytes_1[107]; - HwOutputs._10a1_User_Data_128_bytes_1[108] := PlcOutputs._10a1_User_Data_128_bytes_1[108]; - HwOutputs._10a1_User_Data_128_bytes_1[109] := PlcOutputs._10a1_User_Data_128_bytes_1[109]; - HwOutputs._10a1_User_Data_128_bytes_1[110] := PlcOutputs._10a1_User_Data_128_bytes_1[110]; - HwOutputs._10a1_User_Data_128_bytes_1[111] := PlcOutputs._10a1_User_Data_128_bytes_1[111]; - HwOutputs._10a1_User_Data_128_bytes_1[112] := PlcOutputs._10a1_User_Data_128_bytes_1[112]; - HwOutputs._10a1_User_Data_128_bytes_1[113] := PlcOutputs._10a1_User_Data_128_bytes_1[113]; - HwOutputs._10a1_User_Data_128_bytes_1[114] := PlcOutputs._10a1_User_Data_128_bytes_1[114]; - HwOutputs._10a1_User_Data_128_bytes_1[115] := PlcOutputs._10a1_User_Data_128_bytes_1[115]; - HwOutputs._10a1_User_Data_128_bytes_1[116] := PlcOutputs._10a1_User_Data_128_bytes_1[116]; - HwOutputs._10a1_User_Data_128_bytes_1[117] := PlcOutputs._10a1_User_Data_128_bytes_1[117]; - HwOutputs._10a1_User_Data_128_bytes_1[118] := PlcOutputs._10a1_User_Data_128_bytes_1[118]; - HwOutputs._10a1_User_Data_128_bytes_1[119] := PlcOutputs._10a1_User_Data_128_bytes_1[119]; - HwOutputs._10a1_User_Data_128_bytes_1[120] := PlcOutputs._10a1_User_Data_128_bytes_1[120]; - HwOutputs._10a1_User_Data_128_bytes_1[121] := PlcOutputs._10a1_User_Data_128_bytes_1[121]; - HwOutputs._10a1_User_Data_128_bytes_1[122] := PlcOutputs._10a1_User_Data_128_bytes_1[122]; - HwOutputs._10a1_User_Data_128_bytes_1[123] := PlcOutputs._10a1_User_Data_128_bytes_1[123]; - HwOutputs._10a1_User_Data_128_bytes_1[124] := PlcOutputs._10a1_User_Data_128_bytes_1[124]; - HwOutputs._10a1_User_Data_128_bytes_1[125] := PlcOutputs._10a1_User_Data_128_bytes_1[125]; - HwOutputs._10a1_User_Data_128_bytes_1[126] := PlcOutputs._10a1_User_Data_128_bytes_1[126]; - HwOutputs._10a1_User_Data_128_bytes_1[127] := PlcOutputs._10a1_User_Data_128_bytes_1[127]; - HwOutputs._10a1_User_Data_128_bytes_1[128] := PlcOutputs._10a1_User_Data_128_bytes_1[128]; - HwOutputs._10a1_User_Data_128_bytes_1[129] := PlcOutputs._10a1_User_Data_128_bytes_1[129]; - HwOutputs._10a1_User_Data_128_bytes_1[130] := PlcOutputs._10a1_User_Data_128_bytes_1[130]; - HwOutputs._10a1_User_Data_128_bytes_1[131] := PlcOutputs._10a1_User_Data_128_bytes_1[131]; -END_FUNCTION diff --git a/Export/PLC_1/HwInputs.st b/Export/PLC_1/HwInputs.st deleted file mode 100644 index 9dfa1760b..000000000 --- a/Export/PLC_1/HwInputs.st +++ /dev/null @@ -1,15 +0,0 @@ -TYPE - HwInputs : STRUCT - _11a1_DI_8x24VDC_ST_1 AT %B0 : BYTE; - _11a1_DI_8x24VDC_ST_2 AT %B1 : BYTE; - _12a1_Acquisition_Status_1 AT %B2 : ARRAY[0..2] OF BYTE; - _12a1_Inspection_Status_1 AT %B5 : DWORD; - _12a1_Command_Control_1 AT %B9 : WORD; - _12a1_SoftEvent_Control_1 AT %B11 : BYTE; - _12a1_Results_64_bytes_1 AT %B12 : ARRAY[0..67] OF BYTE; - _10a1_Acquisition_Status_1 AT %B80 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 AT %B83 : BYTE; - _10a1_Soft_Event_Control_1 AT %B84 : BYTE; - _10a1_Result_Data_128_bytes_1 AT %B85 : ARRAY[0..135] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/Export/PLC_1/HwOutputs.st b/Export/PLC_1/HwOutputs.st deleted file mode 100644 index 97d565aed..000000000 --- a/Export/PLC_1/HwOutputs.st +++ /dev/null @@ -1,14 +0,0 @@ -TYPE - HwOutputs : STRUCT - _11a1_DQ_8x24VDC_0_5A_ST_1 AT %B0 : BYTE; - _12a1_Acquisition_Control_1 AT %B1 : BYTE; - _12a1_Inspection_Control_1 AT %B2 : BYTE; - _12a1_Command_Control_1 AT %B3 : WORD; - _12a1_SoftEvent_Control_1 AT %B5 : BYTE; - _12a1_User_Data_64_bytes_1 AT %B6 : ARRAY[0..63] OF BYTE; - _10a1_Acquisition_Control_1 AT %B70 : BYTE; - _10a1_Results_Control_1 AT %B71 : BYTE; - _10a1_Soft_Event_Control_1 AT %B72 : BYTE; - _10a1_User_Data_128_bytes_1 AT %B73 : ARRAY[0..131] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/Export/PLC_1/PlcInputs.st b/Export/PLC_1/PlcInputs.st deleted file mode 100644 index 7fe1d3a2a..000000000 --- a/Export/PLC_1/PlcInputs.st +++ /dev/null @@ -1,15 +0,0 @@ -TYPE - PlcInputs : STRUCT - _11a1_DI_8x24VDC_ST_1 : BYTE; - _11a1_DI_8x24VDC_ST_2 : BYTE; - _12a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _12a1_Inspection_Status_1 : DWORD; - _12a1_Command_Control_1 : WORD; - _12a1_SoftEvent_Control_1 : BYTE; - _12a1_Results_64_bytes_1 : ARRAY[0..67] OF BYTE; - _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/Export/PLC_1/PlcOutputs.st b/Export/PLC_1/PlcOutputs.st deleted file mode 100644 index 2ea4d4ab4..000000000 --- a/Export/PLC_1/PlcOutputs.st +++ /dev/null @@ -1,14 +0,0 @@ -TYPE - PlcOutputs : STRUCT - _11a1_DQ_8x24VDC_0_5A_ST_1 : BYTE; - _12a1_Acquisition_Control_1 : BYTE; - _12a1_Inspection_Control_1 : BYTE; - _12a1_Command_Control_1 : WORD; - _12a1_SoftEvent_Control_1 : BYTE; - _12a1_User_Data_64_bytes_1 : ARRAY[0..63] OF BYTE; - _10a1_Acquisition_Control_1 : BYTE; - _10a1_Results_Control_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; - END_STRUCT; -END_TYPE diff --git a/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION b/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION deleted file mode 100644 index 0617acc51..000000000 --- a/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION +++ /dev/null @@ -1,8 +0,0 @@ - //Copy this VAR_GLOBAL section into your configuration file inside your project. - //Do not change any names, addresses or any another content. - VAR_GLOBAL - HwInputs AT %IB0 : HwInputs; - HwOutputs AT %QB0 : HwOutputs; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR diff --git a/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM b/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM deleted file mode 100644 index 45e075f36..000000000 --- a/Export/PLC_1/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM +++ /dev/null @@ -1,12 +0,0 @@ - //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. - //Do not change any names, addresses or any another content. - VAR_EXTERNAL - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR - //Copy this function call at the very beginning of your program. - //Do not change any names, addresses or any another content. - CopyInputs(); - //Copy this function call at the very end of your program. - //Do not change any names, addresses or any another content. - CopyOutputs(); diff --git a/cake/BuildContext.cs b/cake/BuildContext.cs index 7651544ca..205548e30 100644 --- a/cake/BuildContext.cs +++ b/cake/BuildContext.cs @@ -145,7 +145,7 @@ public BuildContext(ICakeContext context, BuildParameters buildParameters) ("data", "axopen.data"), ("probers", "axopen.probers"), ("components.abstractions", "axopen.components.abstractions"), - ("AXOpen.Cognex.Vision", "axopen.cognex.vision"), + ("components.cognex.vision", "axopen.cognex.vision"), }; public IEnumerable<(string folder, string name, string targetIp, string targetPlatform)> Integrations { get; } = new[] diff --git a/close b/close deleted file mode 100644 index c33e48d0c..000000000 --- a/close +++ /dev/null @@ -1,750 +0,0 @@ -commit e7299920d5cd2a1ef8ce210f93e757a5c539210a (HEAD -> dev, origin/dev, origin/HEAD, Component_CgnReader_LukyTest01) -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Wed Jun 14 14:41:49 2023 +0200 - - updates documentation - -commit 832f800306aae737aae76b63d288a21ceb828042 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Wed Jun 14 14:39:19 2023 +0200 - - [NEW-FEATURE] AxoMessanger should use context logger to provide logging (#98) - - * Create draft PR for #97 - # Identity is not handled by hlap. - - * wip, unit test for object indentity removed due to handling by higher level app - - * add documentation for axo logger and indenties - - * updates to v0.14.0-alpha.108 - - * fix broken compatibility after update to 0.14.0-alpha.108 - - --------- - - Co-authored-by: PTKu - -commit 6211ac98b7961dfb6b07ea01fc748332f36ac242 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Tue Jun 13 06:03:28 2023 +0200 - - [UPDATE] Update to sdk 4.0.2 (#104) - - * Create draft PR for #103 - - * Updates to "@ax/sdk": ^4.0.2 and latest - - --------- - - Co-authored-by: PTKu - -commit d706dfb856487103ce83c79c99612af00693c8a1 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Mon Jun 12 20:36:56 2023 +0200 - - [BUG] Open data window when is not requested (#102) - - * Create draft PR for #101 - - * Updated data window closing - - --------- - - Co-authored-by: Brano5 - Co-authored-by: Branko Zachemsky - -commit 9553d27e1c8f12b61740ab231200a80a650d1865 -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Thu Jun 8 14:42:51 2023 +0200 - - fixed slnf - -commit e9a9d1289b7692ae370edca9c22bcba060390339 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Thu Jun 8 14:08:41 2023 +0200 - - [NEW-FEATURE] Add identity to logging for user actions. (#96) - - * Adds user information to the logging - - security split in two different assemblies (blazor, clr) - - adds information about user perfoming actions. - - removers user info from the app object (must be provided as argument of log function) - - adds logging from AxoTask and AxoToggle task - - context logger now creates a log entry when an message/alarm occurs - - in controller loggers we will need to address the objects identity - - * removes file referenced dependency - - * tests added to L1 running only net7.0 target - - --------- - - Co-authored-by: PTKu - -commit 077f1750749f5dd8a2d87311ecf41235a51b02ff -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Tue Jun 6 16:45:54 2023 +0200 - - fix docu link and regen docs - -commit 1d680631132c2b9db62c4374b74dbeb3084f50f0 -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Tue Jun 6 15:37:38 2023 +0200 - - documenation update - -commit 5d52e7d824b0ed5ca416ffb71e61c98bcbd46254 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Tue Jun 6 15:30:31 2023 +0200 - - [NEW-FEATURE] User and events logging (#90) - - * Create draft PR for #89 - * adds simple event logger (message only) no identity - * from @ax/sdk4.0.1 back "@ax/sdk": ^3.0.18, much trouble - * major refactoring of logging and messaging adds logger documentation (wip) - * add examples and documentation for logging - Removes dynamic messaging and moves static messaging and logging to core. This required major refactoring - keeps using "@ax/sdk": ^3.0.18 due breaking changes in "@ax/sdk": ^4.0.2 - add logging capabilities, we can now log messages from the PLC, however, there is no identity provider implemented yet the log text must provide details. - default logger is the application logger (AxoApplication.Logger) - performance has to still be tested to determine the min. perf. requirements for the system (for details see the documentation). - adds an implementation of Serilog logger for AxoApplication (kept simple, lot of potential for extending). - - --------- - - Co-authored-by: PTKu - -commit fd0ea08cba076d4104461673e4b88b2c3c4a219e -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Tue May 30 09:52:56 2023 +0200 - - Removes dependency of messaging on core to prevent circlularity (#94) - - * removes circular dependencies messaging - core - * removes dynamic messenger (we will keep going with static until we get better com prefomance) - -commit ff1591aaff4222d7212854a3316ef91f6646306d -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Fri May 26 17:14:09 2023 +0200 - - regens documentation with 0.14.0-alpha.107 ixd - -commit 412226a150da6cdf7acdda07e2d09de51bf85a10 -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Thu May 25 16:54:02 2023 +0200 - - documetation re-build - -commit 19d7f8806f5551ea4106e977fb6f5c020b10c31a -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Thu May 25 16:41:55 2023 +0200 - - [NEW-FEATURE] Port security from tco (#60) - - * Create draft PR for #57 - - * create BlazorAuthApp with Auth - - * Update AuthenticationStateProvider service - - * Name refactoring - - * Extract Security to own library - - * Refactoring Security - - * Security refactoring - - * Security refactoring - hashing password, add ravenDB and inMemory implementation for security - - * Security refactoring - added external authentication - - * some changes in ExternalTokenAuthorization - - * Security refactoring - - * Added Example view - - * Security refactoring - - * Security refactoring - AppIdentity - - * Removed UserAccessor - - * Security refactoring - - * refactoring of security, added tests from tcopen wip - - * Security - tests repair - - * added authorization tests, wip on security on multiple clients - - * added initial project for new security, refactoring wip - - * Added role and group for security, refactoring - - * Security refactoring - - * Security refactoring - - * refactor of tests, some minor changes - - * Refactoring - - * Security refactoring - - * wip on security documentation - - * Small changes in RoleGroupManager - - * wip on security docs - - * wip on security - - * Added Example view, wip with documentation - - * wip on sec docs - - * New images in security docs - - * Security Test fix - - * minor changes to models - - * code refactoring, added selected all checkbox to groups - - * adds unit test for security to cake - - --------- - - Co-authored-by: Brano5 - Co-authored-by: Branko Zachemsky - Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> - -commit 46e8a480aae01d03ec152b9ccea84f274a7379f7 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Thu May 25 13:18:33 2023 +0200 - - [Blazor] Momentary task stays in switched on state when button is pressed and page is left by any reason. (#91) - - * Create draft PR for #66 - - * added unfocusout event to momentary task button - - --------- - - Co-authored-by: Specter-13 - Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> - -commit 30508dabb36abafcdabdb24160c4880e5ed372c5 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Thu May 25 12:22:06 2023 +0200 - - Fixes some issues adds integration tests and adds documentation for AxoData (fragments) (#93) - - * fixes some issues with AxoDataFragments - - adds cyclic run method to handle remote calls - - adds integration tests for AxoDataFragments - - * add documentation of AxoDataFragmentExchange and examples - - * fix an run override issue in template - - * add in-code documenation - -commit 03575d26490913ca44ba62e45ffd1b81d606bbe6 -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Tue May 23 07:55:43 2023 +0200 - - documentation regen - -commit 9a791859784c5140d9b45ca37a21213b4f2b70c1 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Tue May 23 07:48:11 2023 +0200 - - updates to v0.14.0-alpha.106 (#88) - -commit 658f101c4cd5dcba24c2d11cf02aeff9f8730d22 -Author: Peto Kurhajec -Date: Mon May 22 11:34:17 2023 +0200 - - adds ign sandbox folder - -commit 7a83eeaf2142e5b7f9f9543c3fa08b4fddd4108d -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Fri May 19 18:36:31 2023 +0200 - - Adds support for combining data scattered over multiple repositories (#85) - - * fixes an isssue where steps in sequencer were not displayed in correct order - - * [wip] adds fragmented data exchange - - * wip - - * wip - - * wip - - * wip - - * fixes axodata documentaion to reflect changes - -commit 7682962945b9d55a481a52e37ea2144e767b8dfb -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Fri May 19 16:57:43 2023 +0200 - - adds project workspace file - -commit 624c1e84bdc9e3989377ad57badeaec55509ef68 -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Fri May 19 16:56:38 2023 +0200 - - CA-CC-BUILD - -commit ea894dd6490cd01c8aeb27174e84cf9cdd45a3c9 -Author: BlazejK -Date: Fri May 19 13:14:35 2023 +0200 - - added local snippets for ix-compiler attributes (#86) - - Co-authored-by: blazej.kuhajda - -commit 70d50bda39ef88ca2cfb37211e3b67333bb043a1 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Thu May 18 16:40:37 2023 +0200 - - Add documentation for AxoMessenger (#84) - - * Create draft PR for #83 - - * adds documentation for AxoMessaging static - - --------- - - Co-authored-by: TomKovac - Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> - -commit b31e7560a1bc471fa37466fac8f5994a2e614996 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Wed May 17 12:44:54 2023 +0200 - - Create unit tests for messaging (tranfered from tco) (#78) - - * Create draft PR for #55 - - * wip messaging - - * AxoMessengerStatic - - * AxoMessengerStatic - - * AxoMesenger static tests added - - * update ax/sdk =>3.0.18 - - * cleanup unnecessary packages from apax.yaml's - - * AxoMessenger static view colors changed to match the verbosity - - * build fix - - --------- - - Co-authored-by: TomKovac - Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> - -commit 90ea1ec72795457f3a6ef6476e9ca15529a53c59 -Author: BlazejK -Date: Mon May 15 13:11:39 2023 +0200 - - removes depenency to legacy Ix.Compiler (#82) - - Co-authored-by: blazej.kuhajda - -commit e27f2d601ad55a24220357521b7d7abadc7bceb5 -Author: Brano5 <97288158+Brano5@users.noreply.github.com> -Date: Fri May 5 15:05:20 2023 +0200 - - Solving some bugs in the axo data (#81) - - * Update InMemoryRepository - - * Some changes in AxoDataView and AxoDataViewModel - - --------- - - Co-authored-by: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> - -commit bc0e4f7c3c0961b721024104962b4d0bede6662f -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Fri May 5 13:18:38 2023 +0200 - - Template additions (#80) - - * various updates and fixies - - updates to v0.14.0-alpha.97 - - adds missing js scripts to template - - adds new snippets - - add utitlity to scaffold snippets from code - - removes readonce from step description - - changes tempalte to use AxoSequencerContainer instead of AxoSequencer - - * improvement to visua of sequencer and step - -commit 74bb094fbaa4b97bbb195def503e2eed56dddd8c -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Thu May 4 13:57:41 2023 +0200 - - various updates and fixies (#79) - - - updates to v0.14.0-alpha.97 - - adds missing js scripts to template - - adds new snippets - - add utitlity to scaffold snippets from code - - removes readonce from step description - - changes tempalte to use AxoSequencerContainer instead of AxoSequencer - -commit aeff8dffb57fffb16ad85525e982bbafc0a8e0b2 -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Wed May 3 14:11:36 2023 +0200 - - documentation update - -commit 556145e060f631b38b5abceb9dad542a52055fc7 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Wed May 3 14:10:23 2023 +0200 - - [BUG] Sequencer should not execute code that is outside steps (#72) - - * Create draft PR for #67 - - * AxoSequencerContainer - - --------- - - Co-authored-by: TomKovac - Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> - -commit effd032ff71deb7640c18e5d13af26c5efc192fe -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Wed May 3 13:30:49 2023 +0200 - - Update README.md (#77) - -commit f253df45e5f52b09276501d9b9031a49aede504b -Author: Peter <61538034+PTKu@users.noreply.github.com> -Date: Wed May 3 13:21:54 2023 +0200 - - documentation regen - -commit b42ef8bf441059de530d83e2c402cf6457d30da0 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Wed May 3 13:19:46 2023 +0200 - - [DOCUMENTATION] axodata readme needs some polishing (#76) - - * Create draft PR for #59 - - * adds more documentation to axodata + linked examples - - * adds bootstrap.bundle.min.js to template.simple - - --------- - - Co-authored-by: PTKu - -commit 6977589674f11600c3d755bf65361040ce899d15 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Wed May 3 07:55:03 2023 +0200 - - additions and clean ups (#75) - - * additions and clean ups - - apax version number updates only when package publishsing is reqested - - cleans up simatic1500 and add simple IRtc implementation for S71500 targets - - add time measurement to AxoTask - - add start time signature to AxoTask - - updates to ax#0.14..0-alpha.96 - - * fixies dependency in s71500 abstaction library - - * null check for initial time stamp required due to missing implementation of rtc in tests - - * version update on dopack instead of dopublish - - * rev tags when publishes - -commit 92c40840541a77377dabfd564cbf884b016edcc4 -Author: Peter Kurhajec <61538034+PTKu@users.noreply.github.com> -Date: Tue May 2 09:36:27 2023 +0200 - - Major refactoring to AXOpen, app template... just an huge PR (#70) - - * Create draft PR for #44 - - * scaffolds remote data exchange - - * experimenting with ix data, wip - - * Concept for Toaster - - * experimenting with ix data, wip - - * ix update - - * experimenting with ix data, wip - - * Create draft PR for #48 - - * Refactor folder IxCore and IxData - - * fixes reference for packables - - * temporarily disables clr test - - * clr tests back - - * sets tests for .net6.0 only - - * asp - - * removes integrations from L1 - - * asp - - * asp - - * adds probers and scaffolds integration testing for dataexchage - - * Add null object for unassinged objects - - * adds error details for task failures - - * adds exception to error message of remote task - - * messaging very first commit - - * Adds integration tests for repositories and whole remote looping with data exchange - - * wip - - * wip - - * [infrastructure] various build fixies - - test publishing - - adds packables - - * adds giversion.build to test project (pipeline failure) - - * downgrades gitversion build to v5.10.3 - - * [infrastructure]swaps tests order - - * hanging tests https://github.com/dotnet/aspnetcore/issues/3443#issuecomment-498329024 - - * asp - - * asp - - * asp - - * DataView design - - * raven integration tests moved to L3 - - * asp - - * AX tests are placed into different folder - - * added loading data on page startup, playing with mvvm - - * mvvm stuff - - * post merge fixies - - * Working buttons in ViewModel - - * Small changes in DataView - - * wip on filtering, added async methods for filtering - - * major refactoring messagning and utils moved to separate projects - - * [infrastructure] variaous build improvements - - * changes namesapces in messaging - - * WIP - - * Working on pagination. Added Messeging for Toast. Repair JsonRepository - - * update packages, replace plaintoshadow methods - - * wio on dataexchange problems - - * Working on filter. Added view for items - - * String builder added - - * Added noticed.md - - * update packages - - * wip getting rid of dynamic - - * wip on generics on dataentity - - * Changes in View - - * wip on data, updated to latest packages - - * small refactoring, implemented selected record and edit functionality, merge with command and status views - - * wip sendToPlc and FromPLC - small refactoring - - * Small changes in toaster - - * minor clean up - - * post merge fix - - * added basic integration unit tests for ixdata - - * Added IxDataTest struct - - * Rename Data to OnlineData - - * wip Update packages to 0.14.0-alpha.69 - - * wip - - * updates ix v0.14.0-alpha.90 solves an issue with ITwinObject generics - - * Change create, copy and load from plc in DataView - - * Fix LoadFromPLC method, changed toaster closing - - * Visual adjustments to DataView - - * rtc implementation added - - * updates to AX# packages - - * rtc injection - - * post merge build - - * wip export and import in DataView - - * backup before removing utils reference from core - - * StringBuilder moved to abstractions due to dependency hell - - * Added option for customizable columns - - * Messaging unit tests completed - - * [wip] doc - - * post merge issue - - * Clicable column in DataView - - * added DataEntityAttribute for marking data objects - - * Docs for Data - - * refactoring ix.framework => AXOpen for abstraction utils and messaging - - * porting to AXSharp and merge with messaging - - * fix packables - - * merge with data and post merge fixies - - * Refactoring-changed namespace from 'ix.framework.core' to 'AXOpen.Core' inside core assembly - - * Refactoring-Ix=>Axo inside core - - * post refactoring upadtes and fixies - - * post merge fixies - - * sync with dev - - * refactoring to AXOpen-renaming core - - * Refactoring-backup project files deleted - - * refactoring data - - * Refactoring data-projects renamed - - * Rafactoring data-namespace changed - - * Refactoring data-Axo prefix added - - * Refactoring data-sync with dev - - * adds missing package content and update to v.0.14.0-alpha.90 - - * sync with 'adds missing package content and update to v.0.14.0-alpha.90' - - * refacoring data - - * refactoring probers - - * cleanup - - * refactoring integrations - - * fix style reference in integration app - - * add template and some adjustments to the frmwrk - - * wip - - * adds ingore apax packages in abstractions - - * mend - - * wip - - * wip - - * wip - - * wip - - * mend - - * wip - - * wip - - * wip - - * removes externals - - * wip - - * merge with tom - - * docu regen - - * fixes to gross errors in data documenation - - * mend - - --------- - - Co-authored-by: PTKu - Co-authored-by: Specter-13 <56168909+Specter-13@users.noreply.github.com> - Co-authored-by: Branko Zachemsky - Co-authored-by: TomKovac - Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> - Co-authored-by: Dávid Špavor diff --git a/docfx/articles/giudelines/componets.md b/docfx/articles/giudelines/componets.md index 8d9c24c58..d337dfa93 100644 --- a/docfx/articles/giudelines/componets.md +++ b/docfx/articles/giudelines/componets.md @@ -5,6 +5,7 @@ | REVISION | DATE | NOTES | |----------|-----------|-----------------| | 0.0 | June 2023 | Initial release | +| 0.1 | August 2023 | Initial release | This document describes the format and practices for writing components in TcOpen. These are universal rules to observe. Each rule knows exception when there is a reasonable argument behind it. @@ -12,9 +13,13 @@ This document describes the format and practices for writing components in TcOpe ## General rules +## Library placement + +Library must be placed in `src` folder of the repository. The containing folder should be named `components`.[manufacturer].[function_group] (e.g. components.cognex.vision). + ### Abstractions -Each component should implement basic contract interface defined in the `AxoAbstractions` library (e.g. `AxoAbbRobot` should implenent `IAxoRobot`, `AxoCongexReader` should impement `IAxoReader`) +Each component should implement basic contract interface defined in the `AxoAbstractions` library (e.g. `AxoAbbRobot` should implenent `IAxoRobot`, `AxoCognexReader` should impement `IAxoReader`) ### I/O variables diff --git a/src/AXOpen-packable-only.slnf b/src/AXOpen-packable-only.slnf index 63554a876..467e0591a 100644 --- a/src/AXOpen-packable-only.slnf +++ b/src/AXOpen-packable-only.slnf @@ -4,6 +4,9 @@ "projects": [ "abstractions\\src\\AXOpen.Abstractions\\ix_ax_axopen_abstractions.csproj", "base\\src\\AXOpen.Base.Abstractions\\AXOpen.Base.Abstractions.csproj", + "components.abstractions\\src\\AXOpen.Components.Abstractions\\ix_ax_axopen_components_abstractions.csproj", + "components.cognex.vision\\src\\AXOpen.Cognex.Vision.Blazor\\axopen_cognex_vision_blazor.csproj", + "components.cognex.vision\\src\\AXOpen.Cognex.Vision\\ix_ax_axopen_cognex_vision.csproj", "core\\src\\AXOpen.Core.Blazor\\axopen_core_blazor.csproj", "core\\src\\AXOpen.Core\\ix_ax_axopen_core.csproj", "data\\src\\AXOpen.Data.Blazor\\axopen_data_blazor.csproj", @@ -11,7 +14,7 @@ "data\\src\\repositories\\InMemory\\AXOpen.Data.InMemory.csproj", "data\\src\\repositories\\Json\\AXOpen.Data.Json.csproj", "data\\src\\repositories\\MongoDb\\AXOpen.Data.MongoDb.csproj", - "data\\src\\repositories\\RavenDb\\AXOpen.Data.RavenDb\\AXOpen.Data.RavenDb.csproj", + "data\\src\\repositories\\RavenDb\\AXOpen.Data.RavenDb\\AXOpen.Data.RavenDb.csproj", "probers\\src\\AXOpen.Probers\\ix_ax_axopen_probers.csproj", "utils\\src\\AXOpen.Utils\\ix_ax_axopen_utils.csproj" ] diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs deleted file mode 100644 index a8f8b7b5d..000000000 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/ExampleJsInterop.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.JSInterop; - -namespace ix.ax.core.blazor -{ - // This class provides an example of how JavaScript functionality can be wrapped - // in a .NET class for easy consumption. The associated JavaScript module is - // loaded on demand when first needed. - // - // This class can be registered as scoped DI service and then injected into Blazor - // components for use. - - //public class ExampleJsInterop : IAsyncDisposable - //{ - // private readonly Lazy> moduleTask; - - // public ExampleJsInterop(IJSRuntime jsRuntime) - // { - // moduleTask = new(() => jsRuntime.InvokeAsync( - // "import", "./_content/ix.ax.core.blazor/exampleJsInterop.js").AsTask()); - // } - - // public async ValueTask Prompt(string message) - // { - // var module = await moduleTask.Value; - // return await module.InvokeAsync("showPrompt", message); - // } - - // public async ValueTask DisposeAsync() - // { - // if (moduleTask.IsValueCreated) - // { - // var module = await moduleTask.Value; - // await module.DisposeAsync(); - // } - // } - //} -} \ No newline at end of file diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js deleted file mode 100644 index ea8d76ad2..000000000 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/exampleJsInterop.js +++ /dev/null @@ -1,6 +0,0 @@ -// This is a JavaScript module that is loaded on demand. It can export any number of -// functions, and may import other JavaScript modules if required. - -export function showPrompt(message) { - return prompt(message, 'Type anything here'); -} diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs deleted file mode 100644 index c09b5b095..000000000 --- a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using AXOpen.Components.Abstractions; -namespace AXOpen.Cognex.Vision.v_6_0_0_0 -{ - public partial class AxoDataman - { - } - - public partial class AxoDataman_Status : AxoComponent_Status - { - Dictionary errorDescriptionDict = new Dictionary(); - Dictionary actionDescriptionDict = new Dictionary(); - - public string ErrorDescription - { - get - { - if(errorDescriptionDict == null) { errorDescriptionDict = new Dictionary(); } - if(errorDescriptionDict.Count == 0) - { - errorDescriptionDict.Add(0 , " "); - errorDescriptionDict.Add(600, "<#Waiting for the signal ResultsAvailable to be reseted!#>"); - errorDescriptionDict.Add(601, "<#Waiting for the signal TriggerReady to be set!#>"); - errorDescriptionDict.Add(602, "<#Waiting for the signal TriggerAcknowledge to be set!#>"); - errorDescriptionDict.Add(603, "<#Waiting for the signal ResultsAvailable to be set!#>"); - - - errorDescriptionDict.Add(700 ,"<#Error: Parent has NULL reference!#>"); - errorDescriptionDict.Add(701 ,"<#Error: AcquisitionControl has NULL reference!#>"); - errorDescriptionDict.Add(702 ,"<#Error: AcquisitionStatus has NULL reference!#>"); - errorDescriptionDict.Add(703 ,"<#Error: ResultsControl has NULL reference!#>"); - errorDescriptionDict.Add(704 ,"<#Error: SoftEventControl has NULL reference!#>"); - errorDescriptionDict.Add(705 ,"<#Error: SoftEventStatus has NULL reference!#>"); - errorDescriptionDict.Add(706 ,"<#Error: ResultData has NULL reference!#>"); - errorDescriptionDict.Add(707 ,"<#Error: UserData has NULL reference!#>"); - errorDescriptionDict.Add(708 ,"<#Error: ResultData has invalid size!#>"); - errorDescriptionDict.Add(709 ,"<#Error: ResultData-lower bound index is not zero!#>"); - errorDescriptionDict.Add(710 ,"<#Error: UserData has invalid size!#>"); - errorDescriptionDict.Add(711 ,"<#Error: UserData-lower bound index is not zero!#>"); - - } - string errorDescription = " "; - if (errorDescriptionDict.TryGetValue(Error.Id.LastValue, out errorDescription)) - { - return errorDescription; - } - else - - { - return " "; - } - } - } - - public string ActionDescription - { - get - { - if (actionDescriptionDict == null) { actionDescriptionDict = new Dictionary(); } - if (actionDescriptionDict.Count == 0) - { - actionDescriptionDict.Add(0 ," "); - actionDescriptionDict.Add(300 ,"<#Restore executed.#>"); - actionDescriptionDict.Add(301 ,"<#Clearing of the result data started.#>"); - actionDescriptionDict.Add(302 ,"<#Clearing of the result data running.#>"); - actionDescriptionDict.Add(303 ,"<#Clearing of the result data was completed successfully.#>"); - actionDescriptionDict.Add(304 ,"<#Reading started.#>"); - actionDescriptionDict.Add(305 ,"<#Reading running.#>"); - actionDescriptionDict.Add(306 ,"<#Reading was completed successfully.#>"); - - - actionDescriptionDict.Add(600 ,"<#Clearing of the result data was aborted, while not yet completed!#>"); - actionDescriptionDict.Add(601 ,"<#Reading was aborted, while not yet completed!#>"); - - actionDescriptionDict.Add(700 ,"<#Clearing of the result data finished with error!#>"); - actionDescriptionDict.Add(701 ,"<#Reading finished with error!#>"); - - } - string actionDescription = " "; - if(actionDescriptionDict.TryGetValue(Action.Id.LastValue, out actionDescription)) - { - return actionDescription; - } - else - { - return " "; - } - - } - } - } -} diff --git a/src/AXOpen.sln b/src/AXOpen.sln index ae4f399dc..14e9f900d 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -128,34 +128,28 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security.Blazor", "s EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security", "security\src\AXOpen.Security\AXOpen.Security.csproj", "{52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Cognex.Vision", "AXOpen.Cognex.Vision", "{AC0F84EB-14D2-48B8-B300-1BA40C03B211}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9AA531A7-5755-4367-96AC-7B2E2710A88D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6AFC7347-C33A-451E-85C9-53CE6988FB3C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.abstractions", "components.abstractions", "{7B7AAED6-B6BF-46B5-80FF-0AE11B4D0039}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5107F409-9BF4-4066-A73D-DABBCBEA096C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_abstractions", "components.abstractions\src\AXOpen.Components.Abstractions\ix_ax_axopen_components_abstractions.csproj", "{863F8789-8441-492F-B5B1-D647B4EE370E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{D16A155E-75AE-48B5-8AC1-81112187DA28}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".config", ".config", "{2B02D701-3632-4D58-9B5B-E43D9E556ACB}" + ProjectSection(SolutionItems) = preProject + templates.simple\.config\dotnet-tools.json = templates.simple\.config\dotnet-tools.json + EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_components_abstractions_tests", "components.abstractions\tests\AXOpen.Components.Abstractions.Tests\axopen_components_abstractions_tests.csproj", "{B8E0FF16-6539-412C-B132-25561350C826}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.cognex.vision", "components.cognex.vision", "{31669443-69E7-4D8F-9800-E71887684792}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_cognex_vision", "AXOpen.Cognex.Vision\src\AXOpen.Cognex.Vision\ix_ax_axopen_cognex_vision.csproj", "{BEACF24D-78B8-4B8D-B6A6-19475143AB50}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{7A82F34B-A479-47D4-8FB6-F9A66FE6591A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_blazor", "AXOpen.Cognex.Vision\src\AXOpen.Cognex.Vision.Blazor\axopen_cognex_vision_blazor.csproj", "{96C2A3EE-76A1-4218-A04C-31AC69BCD398}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{E2BFDC17-38C1-43AD-9CB5-4FA440D2DEEA}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_tests", "AXOpen.Cognex.Vision\tests\AXOpen.Cognex.Vision.Tests\axopen_cognex_vision_tests.csproj", "{58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_cognex_vision", "components.cognex.vision\src\AXOpen.Cognex.Vision\ix_ax_axopen_cognex_vision.csproj", "{38B11CA7-A8CB-4B95-B123-92D3559CC1D2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_components_abstractions_blazor", "components.abstractions\src\AXOpen.Components.Abstractions.Blazor\axopen_components_abstractions_blazor.csproj", "{F99B9470-120F-4D27-8FD7-D1AF5C306A23}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_blazor", "components.cognex.vision\src\AXOpen.Cognex.Vision.Blazor\axopen_cognex_vision_blazor.csproj", "{4D4B57A7-55C4-4AE2-8991-250937389412}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".config", ".config", "{2B02D701-3632-4D58-9B5B-E43D9E556ACB}" - ProjectSection(SolutionItems) = preProject - templates.simple\.config\dotnet-tools.json = templates.simple\.config\dotnet-tools.json - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_cognex_vision_tests", "components.cognex.vision\tests\AXOpen.Cognex.Vision.Tests\axopen_cognex_vision_tests.csproj", "{D3094A68-880C-4637-8F90-6034951E141B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -295,26 +289,18 @@ Global {863F8789-8441-492F-B5B1-D647B4EE370E}.Debug|Any CPU.Build.0 = Debug|Any CPU {863F8789-8441-492F-B5B1-D647B4EE370E}.Release|Any CPU.ActiveCfg = Release|Any CPU {863F8789-8441-492F-B5B1-D647B4EE370E}.Release|Any CPU.Build.0 = Release|Any CPU - {B8E0FF16-6539-412C-B132-25561350C826}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B8E0FF16-6539-412C-B132-25561350C826}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B8E0FF16-6539-412C-B132-25561350C826}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B8E0FF16-6539-412C-B132-25561350C826}.Release|Any CPU.Build.0 = Release|Any CPU - {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEACF24D-78B8-4B8D-B6A6-19475143AB50}.Release|Any CPU.Build.0 = Release|Any CPU - {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96C2A3EE-76A1-4218-A04C-31AC69BCD398}.Release|Any CPU.Build.0 = Release|Any CPU - {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B}.Release|Any CPU.Build.0 = Release|Any CPU - {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F99B9470-120F-4D27-8FD7-D1AF5C306A23}.Release|Any CPU.Build.0 = Release|Any CPU + {38B11CA7-A8CB-4B95-B123-92D3559CC1D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38B11CA7-A8CB-4B95-B123-92D3559CC1D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38B11CA7-A8CB-4B95-B123-92D3559CC1D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38B11CA7-A8CB-4B95-B123-92D3559CC1D2}.Release|Any CPU.Build.0 = Release|Any CPU + {4D4B57A7-55C4-4AE2-8991-250937389412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D4B57A7-55C4-4AE2-8991-250937389412}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D4B57A7-55C4-4AE2-8991-250937389412}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D4B57A7-55C4-4AE2-8991-250937389412}.Release|Any CPU.Build.0 = Release|Any CPU + {D3094A68-880C-4637-8F90-6034951E141B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3094A68-880C-4637-8F90-6034951E141B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3094A68-880C-4637-8F90-6034951E141B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3094A68-880C-4637-8F90-6034951E141B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -370,17 +356,14 @@ Global {1EC46148-A114-4018-92BE-93F1E0273A33} = {FFD509A8-8D3C-4756-9B2E-10A063A246E9} {7DEF0B7B-0F6C-4829-A1A9-2C0C2720BF3C} = {8017588A-7145-460D-ACEB-402D7005DA33} {52B6EFDD-8FF9-4FA7-9624-2E7D8EEDD5C1} = {8017588A-7145-460D-ACEB-402D7005DA33} - {9AA531A7-5755-4367-96AC-7B2E2710A88D} = {AC0F84EB-14D2-48B8-B300-1BA40C03B211} - {6AFC7347-C33A-451E-85C9-53CE6988FB3C} = {AC0F84EB-14D2-48B8-B300-1BA40C03B211} {5107F409-9BF4-4066-A73D-DABBCBEA096C} = {7B7AAED6-B6BF-46B5-80FF-0AE11B4D0039} {863F8789-8441-492F-B5B1-D647B4EE370E} = {5107F409-9BF4-4066-A73D-DABBCBEA096C} - {D16A155E-75AE-48B5-8AC1-81112187DA28} = {7B7AAED6-B6BF-46B5-80FF-0AE11B4D0039} - {B8E0FF16-6539-412C-B132-25561350C826} = {D16A155E-75AE-48B5-8AC1-81112187DA28} - {BEACF24D-78B8-4B8D-B6A6-19475143AB50} = {9AA531A7-5755-4367-96AC-7B2E2710A88D} - {96C2A3EE-76A1-4218-A04C-31AC69BCD398} = {9AA531A7-5755-4367-96AC-7B2E2710A88D} - {58C24B69-00DC-40A7-9CC5-2AD5EE278E4B} = {6AFC7347-C33A-451E-85C9-53CE6988FB3C} - {F99B9470-120F-4D27-8FD7-D1AF5C306A23} = {5107F409-9BF4-4066-A73D-DABBCBEA096C} {2B02D701-3632-4D58-9B5B-E43D9E556ACB} = {0F11518E-CCE1-4B0E-A56D-66D8968EC717} + {7A82F34B-A479-47D4-8FB6-F9A66FE6591A} = {31669443-69E7-4D8F-9800-E71887684792} + {E2BFDC17-38C1-43AD-9CB5-4FA440D2DEEA} = {31669443-69E7-4D8F-9800-E71887684792} + {38B11CA7-A8CB-4B95-B123-92D3559CC1D2} = {7A82F34B-A479-47D4-8FB6-F9A66FE6591A} + {4D4B57A7-55C4-4AE2-8991-250937389412} = {7A82F34B-A479-47D4-8FB6-F9A66FE6591A} + {D3094A68-880C-4637-8F90-6034951E141B} = {E2BFDC17-38C1-43AD-9CB5-4FA440D2DEEA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {292B45BE-E9CB-443B-979D-C0AFCD8D5675} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs deleted file mode 100644 index 7fc953296..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using AXSharp.Presentation.Blazor.Attributes; - -[assembly: RenderableBlazorAssembly()] \ No newline at end of file diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor deleted file mode 100644 index 9ec08f956..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/_Imports.razor +++ /dev/null @@ -1,2 +0,0 @@ -@using Microsoft.AspNetCore.Components.Web -@using AXSharp.Presentation.Blazor.Controls.RenderableContent diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj deleted file mode 100644 index 3604e371a..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/axopen_components_abstractions_blazor.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - net7.0 - enable - enable - AXOpen.Components.Abstractions.Blazor - AXOpen.Components.Abstractions.Blazor - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json deleted file mode 100644 index a1067c7ca..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/package-lock.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "bootstrap-icons": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", - "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" - } - } -} diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/background.png b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/background.png deleted file mode 100644 index e15a3bde6e2bdb380df6a0b46d7ed00bdeb0aaa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK1SGdsl%54rjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwr2>%=KS^ie7oTIEF;HpS|GCbyPusHSqiXaCu3qf)82(9Gq&mZq2{Kq}M*X&MWtJ zSi1Jo7ZzfImg%g=t(qo=wsSR2lZoP(Rj#3wacN=q0?Br(rXzgZEGK2$ID{|A=5S{xJEuzSH>!M+7wSY6hB<=-E^*n0W7 S8wY^CX7F_Nb6Mw<&;$S{dxtsz diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js b/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js deleted file mode 100644 index ea8d76ad2..000000000 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions.Blazor/wwwroot/exampleJsInterop.js +++ /dev/null @@ -1,6 +0,0 @@ -// This is a JavaScript module that is loaded on demand. It can export any number of -// functions, and may import other JavaScript modules if required. - -export function showPrompt(message) { - return prompt(message, 'Type anything here'); -} diff --git a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs deleted file mode 100644 index 8c927eb74..000000000 --- a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; \ No newline at end of file diff --git a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj deleted file mode 100644 index 78a6369e3..000000000 --- a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/axopen_components_abstractions_tests.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - net7.0 - enable - enable - - false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - - - Always - - - - diff --git a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json b/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json deleted file mode 100644 index 7c6944a1d..000000000 --- a/src/components.abstractions/tests/AXOpen.Components.Abstractions.Tests/xunit.runner.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parallelizeTestCollections": false, - "maxParallelThreads": -1 -} diff --git a/src/AXOpen.Cognex.Vision/ctrl/.gitignore b/src/components.cognex.vision/ctrl/.gitignore similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/.gitignore rename to src/components.cognex.vision/ctrl/.gitignore diff --git a/src/AXOpen.Cognex.Vision/ctrl/AXSharp.config.json b/src/components.cognex.vision/ctrl/AXSharp.config.json similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/AXSharp.config.json rename to src/components.cognex.vision/ctrl/AXSharp.config.json diff --git a/src/AXOpen.Cognex.Vision/ctrl/apax.yml b/src/components.cognex.vision/ctrl/apax.yml similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/apax.yml rename to src/components.cognex.vision/ctrl/apax.yml diff --git a/src/AXOpen.Cognex.Vision/ctrl/package-lock.json b/src/components.cognex.vision/ctrl/package-lock.json similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/package-lock.json rename to src/components.cognex.vision/ctrl/package-lock.json diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_ResultDataSize.st diff --git a/src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st similarity index 100% rename from src/AXOpen.Cognex.Vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st rename to src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/eAxoDataman_UserDataSize.st diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/Properties/AssemblyInfo.cs diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/package-lock.json diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/wwwroot/background.png diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs new file mode 100644 index 000000000..7cd8a5967 --- /dev/null +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using AXOpen.Components.Abstractions; +namespace AXOpen.Cognex.Vision.v_6_0_0_0 +{ + public partial class AxoDataman + { + } + + public partial class AxoDataman_Status : AxoComponent_Status + { + Dictionary errorDescriptionDict = new Dictionary(); + Dictionary actionDescriptionDict = new Dictionary(); + + public string ErrorDescription + { + get + { + if(errorDescriptionDict == null) { errorDescriptionDict = new Dictionary(); } + if(errorDescriptionDict.Count == 0) + { + errorDescriptionDict.Add(0 , " "); + errorDescriptionDict.Add(600, "Waiting for the signal ResultsAvailable to be reseted!"); + errorDescriptionDict.Add(601, "Waiting for the signal TriggerReady to be set!"); + errorDescriptionDict.Add(602, "Waiting for the signal TriggerAcknowledge to be set!"); + errorDescriptionDict.Add(603, "Waiting for the signal ResultsAvailable to be set!"); + + + errorDescriptionDict.Add(700 ,"Error: Parent has NULL reference!"); + errorDescriptionDict.Add(701 ,"Error: AcquisitionControl has NULL reference!"); + errorDescriptionDict.Add(702 ,"Error: AcquisitionStatus has NULL reference!"); + errorDescriptionDict.Add(703 ,"Error: ResultsControl has NULL reference!"); + errorDescriptionDict.Add(704 ,"Error: SoftEventControl has NULL reference!"); + errorDescriptionDict.Add(705 ,"Error: SoftEventStatus has NULL reference!"); + errorDescriptionDict.Add(706 ,"Error: ResultData has NULL reference!"); + errorDescriptionDict.Add(707 ,"Error: UserData has NULL reference!"); + errorDescriptionDict.Add(708 ,"Error: ResultData has invalid size!"); + errorDescriptionDict.Add(709 ,"Error: ResultData-lower bound index is not zero!"); + errorDescriptionDict.Add(710 ,"Error: UserData has invalid size!"); + errorDescriptionDict.Add(711 ,"Error: UserData-lower bound index is not zero!"); + + } + string errorDescription = " "; + if (errorDescriptionDict.TryGetValue(Error.Id.LastValue, out errorDescription)) + { + return errorDescription; + } + else + + { + return " "; + } + } + } + + public string ActionDescription + { + get + { + if (actionDescriptionDict == null) { actionDescriptionDict = new Dictionary(); } + if (actionDescriptionDict.Count == 0) + { + actionDescriptionDict.Add(0 ," "); + actionDescriptionDict.Add(300 ,"Restore executed."); + actionDescriptionDict.Add(301 ,"Clearing of the result data started."); + actionDescriptionDict.Add(302 ,"Clearing of the result data running."); + actionDescriptionDict.Add(303 ,"Clearing of the result data was completed successfully."); + actionDescriptionDict.Add(304 ,"Reading started."); + actionDescriptionDict.Add(305 ,"Reading running."); + actionDescriptionDict.Add(306 ,"Reading was completed successfully."); + + + actionDescriptionDict.Add(600 ,"Clearing of the result data was aborted, while not yet completed!"); + actionDescriptionDict.Add(601 ,"Reading was aborted, while not yet completed!"); + + actionDescriptionDict.Add(700 ,"Clearing of the result data finished with error!"); + actionDescriptionDict.Add(701 ,"Reading finished with error!"); + + } + string actionDescription = " "; + if(actionDescriptionDict.TryGetValue(Action.Id.LastValue, out actionDescription)) + { + return actionDescription; + } + else + { + return " "; + } + + } + } + } +} diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision/Properties/AssemblyInfo.cs diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.Designer.cs diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision/Resources/PlcStringResources.resx diff --git a/src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj similarity index 100% rename from src/AXOpen.Cognex.Vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj rename to src/components.cognex.vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs b/src/components.cognex.vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs similarity index 100% rename from src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs rename to src/components.cognex.vision/tests/AXOpen.Cognex.Vision.Tests/Usings.cs diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj b/src/components.cognex.vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj similarity index 100% rename from src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj rename to src/components.cognex.vision/tests/AXOpen.Cognex.Vision.Tests/axopen_cognex_vision_tests.csproj diff --git a/src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json b/src/components.cognex.vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json similarity index 100% rename from src/AXOpen.Cognex.Vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json rename to src/components.cognex.vision/tests/AXOpen.Cognex.Vision.Tests/xunit.runner.json diff --git a/src/core/ctrl/src/AxoComponent/AxoComponent.st b/src/core/ctrl/src/AxoComponent/AxoComponent.st index 25ad0427c..30ccd249a 100644 --- a/src/core/ctrl/src/AxoComponent/AxoComponent.st +++ b/src/core/ctrl/src/AxoComponent/AxoComponent.st @@ -41,7 +41,7 @@ NAMESPACE AXOpen.Core VAR PUBLIC {#ix-set:AttributeName = "<#Is manually controllable#>"} - {attribute clr [ReadOnly()]} + {#ix-attr:[ReadOnly()]} _isManuallyControllable : BOOL; END_VAR diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index bfb22d2f6..9c2feb995 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -3,8 +3,8 @@ version: '0.1.4-alpha.79' type: app targets: - "1500" - - plcsim - - axunit-llvm + #- plcsim + #- axunit-llvm devDependencies: "@ax/sdk": ^4.0.3 "@ax/sld": ^0.15.9 diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs b/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs index d38aa9d36..75a063502 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Program.cs @@ -34,6 +34,17 @@ public static async Task Main(string[] args) .WriteTo.Console().MinimumLevel.Debug() .CreateLogger())); + Entry.Plc.Connector.SetLoggerConfiguration(new LoggerConfiguration() + .WriteTo + .Console() + .WriteTo + .File($"connector.log", + outputTemplate: "{Timestamp:yyyy-MMM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", + fileSizeLimitBytes: 100000) + .MinimumLevel.Debug() + .CreateLogger()); + + Entry.Plc.Connector.ReadWriteCycleDelay = 250; Entry.Plc.Connector.BuildAndStart(); Entry.Plc.Connector.ExceptionBehaviour = CommExceptionBehaviour.Ignore; diff --git a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj index 92ef81564..dcb50db77 100644 --- a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj +++ b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj @@ -24,7 +24,7 @@ - + diff --git a/src/templates.simple/ctrl/Reader.mon b/src/templates.simple/ctrl/Reader.mon deleted file mode 100644 index a5b222674..000000000 --- a/src/templates.simple/ctrl/Reader.mon +++ /dev/null @@ -1,7 +0,0 @@ - -Context.PneumaticManipulator.Components.Citacka._AcquisitionControl -Context.PneumaticManipulator.Components.Citacka._AcquisitionStatus -Context.PneumaticManipulator.Components.Citacka._ResultsControl -Context.PneumaticManipulator.Components.Citacka._ResultsStatus -Context.PneumaticManipulator.Components.Citacka._SoftEventControl -Context.PneumaticManipulator.Components.Citacka._SoftEventStatus diff --git a/src/templates.simple/ctrl/Reader_hw.mon b/src/templates.simple/ctrl/Reader_hw.mon deleted file mode 100644 index 4bc26d878..000000000 --- a/src/templates.simple/ctrl/Reader_hw.mon +++ /dev/null @@ -1,8 +0,0 @@ -HwInputs._10a1_Acquisition_Status_1 -HwInputs._10a1_Results_Status_1 -HwInputs._10a1_Soft_Event_Control_1 -#HwInputs._10a1_Result_Data_128_bytes_1 -HwOutputs._10a1_Acquisition_Control_1 -HwOutputs._10a1_Results_Control_1 -HwOutputs._10a1_Soft_Event_Control_1 -#HwOutputs._10a1_User_Data_128_bytes_1 diff --git a/src/templates.simple/ctrl/Reader_plc.mon b/src/templates.simple/ctrl/Reader_plc.mon deleted file mode 100644 index 184630fd7..000000000 --- a/src/templates.simple/ctrl/Reader_plc.mon +++ /dev/null @@ -1,8 +0,0 @@ -PlcInputs._10a1_Acquisition_Status_1 -PlcInputs._10a1_Results_Status_1 -PlcInputs._10a1_Soft_Event_Control_1 -#PlcInputs._10a1_Result_Data_128_bytes_1 -PlcOutputs._10a1_Acquisition_Control_1 -PlcOutputs._10a1_Results_Control_1 -PlcOutputs._10a1_Soft_Event_Control_1 -#PlcOutputs._10a1_User_Data_128_bytes_1 diff --git a/src/templates.simple/ctrl/snippets/lukas.json b/src/templates.simple/ctrl/snippets/lukas.json deleted file mode 100644 index 3cb048bd7..000000000 --- a/src/templates.simple/ctrl/snippets/lukas.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "For Loop": { - "prefix": ["example"], - "body": [ - "${LINE_COMMENT} prevezme nazvo suboru: ${TM_FILENAME/(.*)\\..+$/$1/} ", - "${LINE_COMMENT} prevezme WORKSPACE_NAME: ${WORKSPACE_NAME} ", - "${LINE_COMMENT} prevezme WORKSPACE_FOLDER: ${WORKSPACE_FOLDER} ", - "${LINE_COMMENT} prevezme TM_FILEPATH: ${TM_FILEPATH} ", - "${LINE_COMMENT} prevezme RELATIVE_FILEPATH: ${RELATIVE_FILEPATH} ", - - "${LINE_COMMENT} da navyber zo vstupnych premennych: ${1|BOOL,REAL,INT,DINT|}", - "${LINE_COMMENT} tu istu premennu pouzije aj tu: ${1}", - "${LINE_COMMENT} da navyber zo vstupnych premennych: ${2:nejaky text}", - - "\t$0", - "${LINE_COMMENT}" - ], - "description": "rozne funkcie snippetu" - } - } \ No newline at end of file diff --git a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st index 424b4199a..8cf50104e 100644 --- a/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st +++ b/src/templates.simple/ctrl/src/Examples/PneumaticManipulator.st @@ -28,8 +28,8 @@ NAMESPACE examples.PneumaticManipulator THIS.Initialize(parent); // HERE INITIALIZE YOUR COMPONENTS HorizontalCylinder.Update(THIS, Inputs.B0[0], Inputs.B0[1], Outputs.B0[0], Outputs.B0[1]); - // VerticalCylinder.Update(THIS, Inputs.B0[2], Inputs.B0[3], PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X2, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X3); - // GripperCylinder.Update(THIS, PlcInputs._11a1_DI_8x24VDC_ST_2.%X6, PlcInputs._11a1_DI_8x24VDC_ST_2.%X7, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X6, PlcOutputs._11a1_DQ_8x24VDC_0_5A_ST_1.%X7); + VerticalCylinder.Update(THIS, Inputs.B0[2], Inputs.B0[3], Outputs.B0[2], Outputs.B0[3]); + GripperCylinder.Update(THIS, Inputs.B0[4], Inputs.B0[5], Outputs.B0[4], Outputs.B0[5]); END_METHOD From 31d6039ac25f83da97516cd20fc2f406619387f0 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 3 Aug 2023 12:14:31 +0200 Subject: [PATCH 22/32] refactoring reference input variables --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 232 +++++++++--------- .../Tasks/AxoDatamanClearResultData.st | 48 ++-- .../v_6_0_0/Tasks/AxoDatamanRead.st | 80 +++--- .../AxoCognexVisionDatamanExample.st | 16 +- 4 files changed, 188 insertions(+), 188 deletions(-) diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 208d4bcac..eb1dea70a 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -106,43 +106,43 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PRIVATE UpdateInputs : BOOL VAR_INPUT - AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; - ResultsStatus : REF_TO BYTE; - SoftEventStatus : REF_TO BYTE; - ResultData : REF_TO ARRAY[*] OF BYTE; + refAcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + refResultsStatus : REF_TO BYTE; + refSoftEventStatus : REF_TO BYTE; + refResultData : REF_TO ARRAY[*] OF BYTE; END_VAR - _AcquisitionStatus.TriggerReady := AcquisitionStatus^[0].%X0; - _AcquisitionStatus.TriggerAcknowledge := AcquisitionStatus^[0].%X1; - _AcquisitionStatus.MissedAcquisition := AcquisitionStatus^[0].%X3; - _AcquisitionStatus.TriggerID.%B1 := AcquisitionStatus^[1]; - _AcquisitionStatus.TriggerID.%B0 := AcquisitionStatus^[2]; - - _ResultsStatus.Decoding := ResultsStatus^.%X0; - _ResultsStatus.DecodeComplete := ResultsStatus^.%X1; - _ResultsStatus.ResultsBufferOverrun := ResultsStatus^.%X2; - _ResultsStatus.ResultsAvailable := ResultsStatus^.%X3; - _ResultsStatus.ErrorDetected := ResultsStatus^.%X7; - - _SoftEventStatus.TrainCodeAcknowledge := SoftEventStatus^.%X0; - _SoftEventStatus.TrainMatchStringAcknowledge := SoftEventStatus^.%X1; - _SoftEventStatus.TrainFocusAcknowledge := SoftEventStatus^.%X2; - _SoftEventStatus.TrainBrightnessAcknowledge := SoftEventStatus^.%X3; - _SoftEventStatus.UntrainAcknowledge := SoftEventStatus^.%X4; - _SoftEventStatus.ExecuteDmccAcknowledge := SoftEventStatus^.%X5; - _SoftEventStatus.Reserved06 := SoftEventStatus^.%X6; - _SoftEventStatus.SetMatchStringAcknowledge := SoftEventStatus^.%X7; - - - IF (LOWER_BOUND(ResultData^,1) = 0) THEN - IF (UPPER_BOUND(ResultData^,1) = 23) THEN + _AcquisitionStatus.TriggerReady := refAcquisitionStatus^[0].%X0; + _AcquisitionStatus.TriggerAcknowledge := refAcquisitionStatus^[0].%X1; + _AcquisitionStatus.MissedAcquisition := refAcquisitionStatus^[0].%X3; + _AcquisitionStatus.TriggerID.%B1 := refAcquisitionStatus^[1]; + _AcquisitionStatus.TriggerID.%B0 := refAcquisitionStatus^[2]; + + _ResultsStatus.Decoding := refResultsStatus^.%X0; + _ResultsStatus.DecodeComplete := refResultsStatus^.%X1; + _ResultsStatus.ResultsBufferOverrun := refResultsStatus^.%X2; + _ResultsStatus.ResultsAvailable := refResultsStatus^.%X3; + _ResultsStatus.ErrorDetected := refResultsStatus^.%X7; + + _SoftEventStatus.TrainCodeAcknowledge := refSoftEventStatus^.%X0; + _SoftEventStatus.TrainMatchStringAcknowledge := refSoftEventStatus^.%X1; + _SoftEventStatus.TrainFocusAcknowledge := refSoftEventStatus^.%X2; + _SoftEventStatus.TrainBrightnessAcknowledge := refSoftEventStatus^.%X3; + _SoftEventStatus.UntrainAcknowledge := refSoftEventStatus^.%X4; + _SoftEventStatus.ExecuteDmccAcknowledge := refSoftEventStatus^.%X5; + _SoftEventStatus.Reserved06 := refSoftEventStatus^.%X6; + _SoftEventStatus.SetMatchStringAcknowledge := refSoftEventStatus^.%X7; + + + IF (LOWER_BOUND(refResultData^,1) = 0) THEN + IF (UPPER_BOUND(refResultData^,1) = 23) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_16B; - ELSIF (UPPER_BOUND(ResultData^,1) = 39) THEN + ELSIF (UPPER_BOUND(refResultData^,1) = 39) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_32B; - ELSIF (UPPER_BOUND(ResultData^,1) = 71) THEN + ELSIF (UPPER_BOUND(refResultData^,1) = 71) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_64B; - ELSIF (UPPER_BOUND(ResultData^,1) = 135) THEN + ELSIF (UPPER_BOUND(refResultData^,1) = 135) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_128B; - ELSIF (UPPER_BOUND(ResultData^,1) = 253) THEN + ELSIF (UPPER_BOUND(refResultData^,1) = 253) THEN Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_246B; ELSE Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; @@ -156,14 +156,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF(Status.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN - Results.Id.%B1 := ResultData^[0]; - Results.Id.%B0 := ResultData^[1]; - Results.Code.%B1 := ResultData^[2]; - Results.Code.%B0 := ResultData^[3]; - Results.Extended.%B1 := ResultData^[4]; - Results.Extended.%B0 := ResultData^[5]; - Results.Length.%B1 := ResultData^[6]; - Results.Length.%B0 := ResultData^[7]; + Results.Id.%B1 := refResultData^[0]; + Results.Id.%B0 := refResultData^[1]; + Results.Code.%B1 := refResultData^[2]; + Results.Code.%B0 := refResultData^[3]; + Results.Extended.%B1 := refResultData^[4]; + Results.Extended.%B0 := refResultData^[5]; + Results.Length.%B1 := refResultData^[6]; + Results.Length.%B0 := refResultData^[7]; UpdateInputs := TRUE; END_IF; @@ -171,37 +171,37 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PRIVATE UpdateOutputs : BOOL VAR_INPUT - AcquisitionControl : REF_TO BYTE; - ResultsControl : REF_TO BYTE; - SoftEventControl : REF_TO BYTE; - UserData : REF_TO ARRAY[*] OF BYTE; + refAcquisitionControl : REF_TO BYTE; + refResultsControl : REF_TO BYTE; + refSoftEventControl : REF_TO BYTE; + refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR - AcquisitionControl^.%X0 := _AcquisitionControl.TriggerEnable; - AcquisitionControl^.%X1 := _AcquisitionControl.Trigger; + refAcquisitionControl^.%X0 := _AcquisitionControl.TriggerEnable; + refAcquisitionControl^.%X1 := _AcquisitionControl.Trigger; - ResultsControl^.%X0 := _ResultsControl.EnableResultBuffering; - ResultsControl^.%X1 := _ResultsControl.ResultsAcknowledge; + refResultsControl^.%X0 := _ResultsControl.EnableResultBuffering; + refResultsControl^.%X1 := _ResultsControl.ResultsAcknowledge; - SoftEventControl^.%X0 := _SoftEventControl.TrainCode; - SoftEventControl^.%X1 := _SoftEventControl.TrainMatchString; - SoftEventControl^.%X2 := _SoftEventControl.TrainFocus; - SoftEventControl^.%X3 := _SoftEventControl.TrainBrightness; - SoftEventControl^.%X4 := _SoftEventControl.Untrain; - SoftEventControl^.%X5 := _SoftEventControl.ExecuteDMCC; - SoftEventControl^.%X6 := _SoftEventControl.Reserved06; - SoftEventControl^.%X7 := _SoftEventControl.SetMatchString; - - IF (LOWER_BOUND(UserData^,1) = 0) THEN - IF (UPPER_BOUND(UserData^,1) = 19) THEN + refSoftEventControl^.%X0 := _SoftEventControl.TrainCode; + refSoftEventControl^.%X1 := _SoftEventControl.TrainMatchString; + refSoftEventControl^.%X2 := _SoftEventControl.TrainFocus; + refSoftEventControl^.%X3 := _SoftEventControl.TrainBrightness; + refSoftEventControl^.%X4 := _SoftEventControl.Untrain; + refSoftEventControl^.%X5 := _SoftEventControl.ExecuteDMCC; + refSoftEventControl^.%X6 := _SoftEventControl.Reserved06; + refSoftEventControl^.%X7 := _SoftEventControl.SetMatchString; + + IF (LOWER_BOUND(refUserData^,1) = 0) THEN + IF (UPPER_BOUND(refUserData^,1) = 19) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_16B; - ELSIF (UPPER_BOUND(UserData^,1) = 35) THEN + ELSIF (UPPER_BOUND(refUserData^,1) = 35) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_32B; - ELSIF (UPPER_BOUND(UserData^,1) = 67) THEN + ELSIF (UPPER_BOUND(refUserData^,1) = 67) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_64B; - ELSIF (UPPER_BOUND(UserData^,1) = 131) THEN + ELSIF (UPPER_BOUND(refUserData^,1) = 131) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_128B; - ELSIF (UPPER_BOUND(UserData^,1) = 253) THEN + ELSIF (UPPER_BOUND(refUserData^,1) = 253) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE Status.Error.Id := UINT#710; @@ -213,39 +213,39 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN - UserData^[0] := User.Option.%B1; - UserData^[1] := User.Option.%B0; - UserData^[2] := User.Length.%B1; - UserData^[3] := User.Length.%B0; + refUserData^[0] := User.Option.%B1; + refUserData^[1] := User.Option.%B0; + refUserData^[2] := User.Length.%B1; + refUserData^[3] := User.Length.%B0; UpdateOutputs := TRUE; END_IF; END_METHOD METHOD PRIVATE IsValidReferences: BOOL VAR_INPUT - AcquisitionControl : REF_TO BYTE; - AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; - ResultsControl : REF_TO BYTE; - ResultsStatus : REF_TO BYTE; - SoftEventControl : REF_TO BYTE; - SoftEventStatus : REF_TO BYTE; - ResultData : REF_TO ARRAY[*] OF BYTE; - UserData : REF_TO ARRAY[*] OF BYTE; + refAcquisitionControl : REF_TO BYTE; + refAcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + refResultsControl : REF_TO BYTE; + refResultsStatus : REF_TO BYTE; + refSoftEventControl : REF_TO BYTE; + refSoftEventStatus : REF_TO BYTE; + refResultData : REF_TO ARRAY[*] OF BYTE; + refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR IsValidReferences := FALSE; - IF AcquisitionControl = NULL THEN + IF refAcquisitionControl = NULL THEN Status.Error.Id := UINT#701; - ELSIF AcquisitionStatus = NULL THEN + ELSIF refAcquisitionStatus = NULL THEN Status.Error.Id := UINT#702; - ELSIF ResultsControl = NULL THEN + ELSIF refResultsControl = NULL THEN Status.Error.Id := UINT#703; - ELSIF SoftEventControl = NULL THEN + ELSIF refSoftEventControl = NULL THEN Status.Error.Id := UINT#704; - ELSIF SoftEventStatus = NULL THEN + ELSIF refSoftEventStatus = NULL THEN Status.Error.Id := UINT#705; - ELSIF ResultData = NULL THEN + ELSIF refResultData = NULL THEN Status.Error.Id := UINT#706; - ELSIF UserData = NULL THEN + ELSIF refUserData = NULL THEN Status.Error.Id := UINT#707; ELSE IsValidReferences := TRUE; @@ -257,64 +257,64 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT - parent : IAxoObject; - AcquisitionControl : REF_TO BYTE; - AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; - ResultsControl : REF_TO BYTE; - ResultsStatus : REF_TO BYTE; - SoftEventControl : REF_TO BYTE; - SoftEventStatus : REF_TO BYTE; - ResultData : REF_TO ARRAY[*] OF BYTE; - UserData : REF_TO ARRAY[*] OF BYTE; + parent : IAxoObject; + refAcquisitionControl : REF_TO BYTE; + refAcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + refResultsControl : REF_TO BYTE; + refResultsStatus : REF_TO BYTE; + refSoftEventControl : REF_TO BYTE; + refSoftEventStatus : REF_TO BYTE; + refResultData : REF_TO ARRAY[*] OF BYTE; + refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR IF parent = NULL THEN Status.Error.Id := UINT#700; RETURN; END_IF; - IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN + IF NOT THIS.IsValidReferences(refAcquisitionControl,refAcquisitionStatus,refResultsControl,refResultsStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData) THEN RETURN; END_IF; THIS.Initialize(parent); THIS.Open(); - THIS.Execute(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData); + THIS.Execute(refAcquisitionControl,refAcquisitionStatus,refResultsControl,refResultsStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData); THIS.Close(); END_METHOD METHOD PUBLIC Run VAR_INPUT - parent : IAxoContext; - AcquisitionControl : REF_TO BYTE; - AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; - ResultsControl : REF_TO BYTE; - ResultsStatus : REF_TO BYTE; - SoftEventControl : REF_TO BYTE; - SoftEventStatus : REF_TO BYTE; - ResultData : REF_TO ARRAY[*] OF BYTE; - UserData : REF_TO ARRAY[*] OF BYTE; + parent : IAxoContext; + refAcquisitionControl : REF_TO BYTE; + refAcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + refResultsControl : REF_TO BYTE; + refResultsStatus : REF_TO BYTE; + refSoftEventControl : REF_TO BYTE; + refSoftEventStatus : REF_TO BYTE; + refResultData : REF_TO ARRAY[*] OF BYTE; + refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR IF parent = NULL THEN Status.Error.Id := UINT#700; RETURN; END_IF; - IF NOT THIS.IsValidReferences(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData) THEN + IF NOT THIS.IsValidReferences(refAcquisitionControl,refAcquisitionStatus,refResultsControl,refResultsStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData) THEN RETURN; END_IF; THIS.Initialize(parent); THIS.Open(); - THIS.Execute(AcquisitionControl,AcquisitionStatus,ResultsControl,ResultsStatus,SoftEventControl,SoftEventStatus,ResultData,UserData); - THIS.Close(); + THIS.Execute(refAcquisitionControl,refAcquisitionStatus,refResultsControl,refResultsStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData); + THIS.Close(); END_METHOD METHOD PRIVATE Execute VAR_INPUT - AcquisitionControl : REF_TO BYTE; - AcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; - ResultsControl : REF_TO BYTE; - ResultsStatus : REF_TO BYTE; - SoftEventControl : REF_TO BYTE; - SoftEventStatus : REF_TO BYTE; - ResultData : REF_TO ARRAY[*] OF BYTE; - UserData : REF_TO ARRAY[*] OF BYTE; + refAcquisitionControl : REF_TO BYTE; + refAcquisitionStatus : REF_TO ARRAY[0..2] OF BYTE; + refResultsControl : REF_TO BYTE; + refResultsStatus : REF_TO BYTE; + refSoftEventControl : REF_TO BYTE; + refSoftEventStatus : REF_TO BYTE; + refResultData : REF_TO ARRAY[*] OF BYTE; + refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR _restoreTask.Initialize(THIS); @@ -322,7 +322,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _clearResultDataTask.Initialize(THIS); _readTask.Initialize(THIS); - THIS.UpdateInputs(AcquisitionStatus,ResultsStatus,SoftEventStatus,ResultData); + THIS.UpdateInputs(refAcquisitionStatus,refResultsStatus,refSoftEventStatus,refResultData); //*************RESTORE******************** _taskDisabled := FALSE; @@ -350,10 +350,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************READ*********************** _taskDisabled := _taskDisabled OR _clearResultDataTask.IsBusy(); _readTask.IsDisabled := _taskDisabled; - _readTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results),ResultData); + _readTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results),refResultData); //**************************************** - THIS.UpdateOutputs(AcquisitionControl,ResultsControl,SoftEventControl,UserData); + THIS.UpdateOutputs(refAcquisitionControl,refResultsControl,refSoftEventControl,refUserData); END_METHOD METHOD PROTECTED OVERRIDE Close diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 3b0ddfcff..2bed3e0fe 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -16,57 +16,57 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT - AcquisitionControl : REF_TO AxoDataman_AcquisitionControl; - AcquisitionStatus : REF_TO AxoDataman_AcquisitionStatus; - ResultsControl : REF_TO AxoDataman_ResultsControl; - ResultsStatus : REF_TO AxoDataman_ResultsStatus; - Config : REF_TO AxoDataman_Config; - Status : REF_TO AxoDataman_Status; - Results : REF_TO AxoDataman_Results; - ResultData : REF_TO ARRAY[*] OF BYTE; + refAcquisitionControl : REF_TO AxoDataman_AcquisitionControl; + refAcquisitionStatus : REF_TO AxoDataman_AcquisitionStatus; + refResultsControl : REF_TO AxoDataman_ResultsControl; + refResultsStatus : REF_TO AxoDataman_ResultsStatus; + refConfig : REF_TO AxoDataman_Config; + refStatus : REF_TO AxoDataman_Status; + refResults : REF_TO AxoDataman_Results; + refResultData : REF_TO ARRAY[*] OF BYTE; END_VAR VAR _index : INT; END_VAR - _infoTime := Config^.InfoTime; - _errorTime := Config^.ErrorTime; - _Status := Status; + _infoTime := refConfig^.InfoTime; + _errorTime := refConfig^.ErrorTime; + _Status := refStatus; IF THIS.Execute() THEN IF _progress = 0 THEN - Status^.Action.Id := UINT#302; - Status^.Error.Id := UINT#0; + refStatus^.Action.Id := UINT#302; + refStatus^.Error.Id := UINT#0; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 1 THEN - AcquisitionControl^.TriggerEnable := FALSE; - AcquisitionControl^.Trigger := FALSE; - ResultsControl^.ResultsAcknowledge := TRUE; - Results^.Id := UINT#0; - Results^.Code := UINT#0; - Results^.Extended := UINT#0; - Results^.Length := UINT#0; + refAcquisitionControl^.TriggerEnable := FALSE; + refAcquisitionControl^.Trigger := FALSE; + refResultsControl^.ResultsAcknowledge := TRUE; + refResults^.Id := UINT#0; + refResults^.Code := UINT#0; + refResults^.Extended := UINT#0; + refResults^.Length := UINT#0; - Results^.Data := ''; + refResults^.Data := ''; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 2 THEN IF _infoTimer.output THEN - Status^.Error.Id := UINT#600; + refStatus^.Error.Id := UINT#600; END_IF; - IF NOT ResultsStatus^.ResultsAvailable THEN + IF NOT refResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 3 THEN - ResultsControl^.ResultsAcknowledge := FALSE; + refResultsControl^.ResultsAcknowledge := FALSE; THIS.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index 74e236f58..f891cc69b 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -16,30 +16,30 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PUBLIC Run VAR_INPUT - AcquisitionControl : REF_TO AxoDataman_AcquisitionControl; - AcquisitionStatus : REF_TO AxoDataman_AcquisitionStatus; - ResultsControl : REF_TO AxoDataman_ResultsControl; - ResultsStatus : REF_TO AxoDataman_ResultsStatus; - Config : REF_TO AxoDataman_Config; - Status : REF_TO AxoDataman_Status; - Results : REF_TO AxoDataman_Results; - ResultData : REF_TO ARRAY[*] OF BYTE; + refAcquisitionControl : REF_TO AxoDataman_AcquisitionControl; + refAcquisitionStatus : REF_TO AxoDataman_AcquisitionStatus; + refResultsControl : REF_TO AxoDataman_ResultsControl; + refResultsStatus : REF_TO AxoDataman_ResultsStatus; + refConfig : REF_TO AxoDataman_Config; + refStatus : REF_TO AxoDataman_Status; + refResults : REF_TO AxoDataman_Results; + refResultData : REF_TO ARRAY[*] OF BYTE; END_VAR VAR _index : INT; END_VAR - _infoTime := Config^.InfoTime; - _errorTime := Config^.ErrorTime; - _Status := Status; + _infoTime := refConfig^.InfoTime; + _errorTime := refConfig^.ErrorTime; + _Status := refStatus; IF THIS.Execute() THEN IF _progress = 0 THEN - Status^.Action.Id := UINT#305; - Status^.Error.Id := UINT#0; + refStatus^.Action.Id := UINT#305; + refStatus^.Error.Id := UINT#0; THIS.CallTimers(FALSE); - IF ResultsStatus^.ErrorDetected THEN + IF refResultsStatus^.ErrorDetected THEN _progress := 20; ELSE _progress := _progress + 1; @@ -47,14 +47,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 1 THEN - AcquisitionControl^.TriggerEnable := TRUE; - AcquisitionControl^.Trigger := FALSE; - ResultsControl^.EnableResultBuffering := FALSE; - ResultsControl^.ResultsAcknowledge := ResultsStatus^.ResultsAvailable; + refAcquisitionControl^.TriggerEnable := TRUE; + refAcquisitionControl^.Trigger := FALSE; + refResultsControl^.EnableResultBuffering := FALSE; + refResultsControl^.ResultsAcknowledge := refResultsStatus^.ResultsAvailable; IF _infoTimer.output THEN - Status^.Error.Id := UINT#600; + refStatus^.Error.Id := UINT#600; END_IF; - IF NOT ResultsStatus^.ResultsAvailable THEN + IF NOT refResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -62,20 +62,20 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 2 THEN IF _infoTimer.output THEN - Status^.Error.Id := UINT#601; + refStatus^.Error.Id := UINT#601; END_IF; - IF AcquisitionStatus^.TriggerReady THEN + IF refAcquisitionStatus^.TriggerReady THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 3 THEN - AcquisitionControl^.Trigger := TRUE; + refAcquisitionControl^.Trigger := TRUE; IF _infoTimer.output THEN - Status^.Error.Id := UINT#602; + refStatus^.Error.Id := UINT#602; END_IF; - IF AcquisitionStatus^.TriggerAcknowledge THEN + IF refAcquisitionStatus^.TriggerAcknowledge THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -83,50 +83,50 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 4 THEN IF _infoTimer.output THEN - Status^.Error.Id := UINT#603; + refStatus^.Error.Id := UINT#603; END_IF; - IF ResultsStatus^.ResultsAvailable THEN + IF refResultsStatus^.ResultsAvailable THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 5 THEN - THIS.ThrowWhen(Results^.Code = UINT#0 OR Results^.Length=UINT#0 OR Results^.Length > TO_UINT(Status^.ResultDataSize)); + THIS.ThrowWhen(refResults^.Code = UINT#0 OR refResults^.Length=UINT#0 OR refResults^.Length > TO_UINT(refStatus^.ResultDataSize)); THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 6 THEN - System.SerDe.Deserialize(UINT#7, ResultData^, Results^.Data); - AcquisitionControl^.Trigger := FALSE; - ResultsControl^.EnableResultBuffering := FALSE; - ResultsControl^.ResultsAcknowledge := TRUE; + System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); + refAcquisitionControl^.Trigger := FALSE; + refResultsControl^.EnableResultBuffering := FALSE; + refResultsControl^.ResultsAcknowledge := TRUE; THIS.DoneWhen(TRUE); _progress := 0; END_IF; IF _progress = 20 THEN - AcquisitionControl^.TriggerEnable :=FALSE; - AcquisitionControl^.Trigger := FALSE; - ResultsControl^.EnableResultBuffering := FALSE; - ResultsControl^.ResultsAcknowledge := FALSE; - IF NOT AcquisitionStatus^.TriggerReady THEN + refAcquisitionControl^.TriggerEnable :=FALSE; + refAcquisitionControl^.Trigger := FALSE; + refResultsControl^.EnableResultBuffering := FALSE; + refResultsControl^.ResultsAcknowledge := FALSE; + IF NOT refAcquisitionStatus^.TriggerReady THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 21 THEN - AcquisitionControl^.TriggerEnable :=TRUE; - IF NOT ResultsStatus^.ErrorDetected THEN + refAcquisitionControl^.TriggerEnable :=TRUE; + IF NOT refResultsStatus^.ErrorDetected THEN THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; END_IF; IF _progress = 22 THEN - AcquisitionControl^.TriggerEnable :=FALSE; + refAcquisitionControl^.TriggerEnable :=FALSE; IF _infoTimer.elapsedTime >= T#1s THEN THIS.CallTimers(FALSE); _progress := 1; diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index 8e960a83a..11e38370b 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -20,14 +20,14 @@ NAMESPACE AxoCognexVisionDatamanExamples END_IF; // Calling the main method `Run` with respective input and output variables. MyDataman.Run( parent := THIS, - AcquisitionControl := REF(PlcOutputs^._10a1_Acquisition_Control_1), - AcquisitionStatus := REF(PlcInputs^._10a1_Acquisition_Status_1), - ResultsControl := REF(PlcOutputs^._10a1_Results_Control_1), - ResultsStatus := REF(PlcInputs^._10a1_Results_Status_1), - SoftEventControl := REF(PlcOutputs^._10a1_Soft_Event_Control_1), - SoftEventStatus := REF(PlcInputs^._10a1_Soft_Event_Control_1), - ResultData := REF(PlcInputs^._10a1_Result_Data_128_bytes_1), - UserData := REF(PlcOutputs^._10a1_User_Data_128_bytes_1)); + refAcquisitionControl := REF(PlcOutputs^._10a1_Acquisition_Control_1), + refAcquisitionStatus := REF(PlcInputs^._10a1_Acquisition_Status_1), + refResultsControl := REF(PlcOutputs^._10a1_Results_Control_1), + refResultsStatus := REF(PlcInputs^._10a1_Results_Status_1), + refSoftEventControl := REF(PlcOutputs^._10a1_Soft_Event_Control_1), + refSoftEventStatus := REF(PlcInputs^._10a1_Soft_Event_Control_1), + refResultData := REF(PlcInputs^._10a1_Result_Data_128_bytes_1), + refUserData := REF(PlcOutputs^._10a1_User_Data_128_bytes_1)); END_METHOD END_CLASS END_NAMESPACE From a09fe981ec0484427aa5364a4015b1f26fa0a34d Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 3 Aug 2023 13:31:57 +0200 Subject: [PATCH 23/32] cognex vision-some styling modification --- .../ctrl/src/AxoComponent_Status.st | 4 ++-- .../AxoTextList/AxoTextListView.razor | 4 ++-- .../AxoTextList/AxoTextListView.razor.cs | 13 ++++++------- src/integrations/ctrl/apax.yml | 4 ++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/components.abstractions/ctrl/src/AxoComponent_Status.st b/src/components.abstractions/ctrl/src/AxoComponent_Status.st index b20fdb004..8e275fcea 100644 --- a/src/components.abstractions/ctrl/src/AxoComponent_Status.st +++ b/src/components.abstractions/ctrl/src/AxoComponent_Status.st @@ -3,9 +3,9 @@ USING AXOpen.Core; NAMESPACE AXOpen.Components.Abstractions CLASS PUBLIC AxoComponent_Status VAR PUBLIC - {#ix-set:AttributeName = "ActionDescription |[[1]ActionDescription]|"} + {#ix-set:AttributeName = "ActionDescription: |[[1]ActionDescription]|"} Action : AXOpen.Core.AxoTextList; - {#ix-set:AttributeName = "ErrorDescription |[[1]ErrorDescription]|"} + {#ix-set:AttributeName = "ErrorDescription: |[[1]ErrorDescription]|"} Error : AXOpen.Core.AxoTextList; END_VAR END_CLASS diff --git a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor index 9dce6d9ea..bd35b1199 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor @@ -4,8 +4,8 @@ @inherits RenderableComplexComponentBase @implements IDisposable; -
    -
    +
    +
    @_text
    \ No newline at end of file diff --git a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs index 49ffdea60..32fbd07b6 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs @@ -3,17 +3,16 @@ public partial class AxoTextListView : IDisposable { - - private string _btnClass + private string _cardClass { get { - if (Component.Id.Cyclic < (int)AXOpen.Messaging.eAxoMessageCategory.Warning) - return "btn-info"; - else if(Component.Id.Cyclic >= (int)AXOpen.Messaging.eAxoMessageCategory.Error) - return "btn-danger"; + if (Component.Id.Cyclic < (int)Messaging.eAxoMessageCategory.Warning) + return "card bg-primary text-light mb-1"; + else if (Component.Id.Cyclic >= (int)Messaging.eAxoMessageCategory.Error) + return "card bg-danger text-white mb-1"; else - return "btn-warning"; + return "card bg-warning text-black mb-1"; } } diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index 9c2feb995..5e5e81ad1 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -2,8 +2,8 @@ name: "axopen.integrations" version: '0.1.4-alpha.79' type: app targets: - - "1500" - #- plcsim + #- "1500" + - plcsim #- axunit-llvm devDependencies: "@ax/sdk": ^4.0.3 From 4ad01b221cdcb858322ea4090e1d3fadba1da8ef Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 3 Aug 2023 13:32:57 +0200 Subject: [PATCH 24/32] axunit-llvm target added --- src/integrations/ctrl/apax.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index 5e5e81ad1..087b648bb 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -4,7 +4,7 @@ type: app targets: #- "1500" - plcsim - #- axunit-llvm + - axunit-llvm devDependencies: "@ax/sdk": ^4.0.3 "@ax/sld": ^0.15.9 From 7f8729b355ee3a2c75e8b1987ac34e4d870da695 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 3 Aug 2023 14:38:33 +0200 Subject: [PATCH 25/32] AxoTextList warning level and error level defined by attributes inside the PLC code --- .../ctrl/src/AxoComponent_Status.st | 4 +++ .../AxoTextList/AxoTextListView.razor.cs | 23 +++++++++---- .../AXOpen.Core/AxoTextList/AxoTextList.cs | 34 +++++++++++++++---- .../AxoTextList/AxoTextListExample.st | 20 ++++++++--- .../AxoTextList/AxoTextListExample.razor | 8 ++++- .../AxoTextListExampleContext.cs | 29 +++++++++++++++- 6 files changed, 98 insertions(+), 20 deletions(-) diff --git a/src/components.abstractions/ctrl/src/AxoComponent_Status.st b/src/components.abstractions/ctrl/src/AxoComponent_Status.st index 8e275fcea..2819898b7 100644 --- a/src/components.abstractions/ctrl/src/AxoComponent_Status.st +++ b/src/components.abstractions/ctrl/src/AxoComponent_Status.st @@ -4,8 +4,12 @@ NAMESPACE AXOpen.Components.Abstractions CLASS PUBLIC AxoComponent_Status VAR PUBLIC {#ix-set:AttributeName = "ActionDescription: |[[1]ActionDescription]|"} + {#ix-attr:[WarningLevel(600)]} + {#ix-attr:[ErrorLevel(700)]} Action : AXOpen.Core.AxoTextList; {#ix-set:AttributeName = "ErrorDescription: |[[1]ErrorDescription]|"} + {#ix-attr:[WarningLevel(600)]} + {#ix-attr:[ErrorLevel(700)]} Error : AXOpen.Core.AxoTextList; END_VAR END_CLASS diff --git a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs index 32fbd07b6..5c3b41e32 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoTextList/AxoTextListView.razor.cs @@ -1,18 +1,29 @@ -namespace AXOpen.Core +using AXSharp.Connector; + +namespace AXOpen.Core { public partial class AxoTextListView : IDisposable { + private uint _warningLevel => this.Component.GetAttribute() != null ? this.Component.GetAttribute().Level : 0; + private uint _errorLevel => this.Component.GetAttribute() != null ? this.Component.GetAttribute().Level : 0; private string _cardClass { get { - if (Component.Id.Cyclic < (int)Messaging.eAxoMessageCategory.Warning) - return "card bg-primary text-light mb-1"; - else if (Component.Id.Cyclic >= (int)Messaging.eAxoMessageCategory.Error) - return "card bg-danger text-white mb-1"; + if(_warningLevel>0 && _errorLevel > _warningLevel) + { + if (Component.Id.Cyclic < _warningLevel) + return "card bg-primary text-light mb-1"; + else if (Component.Id.Cyclic >= _errorLevel) + return "card bg-danger text-white mb-1"; + else + return "card bg-warning text-black mb-1"; + } else - return "card bg-warning text-black mb-1"; + return "card bg-primary text-light mb-1"; + + } } diff --git a/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs b/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs index c4f5915b1..91b0672cf 100644 --- a/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs +++ b/src/core/src/AXOpen.Core/AxoTextList/AxoTextList.cs @@ -1,10 +1,4 @@ using System; -using AXSharp.Connector; -using AXSharp.Connector.ValueTypes; -using System.Collections.Generic; -using AXOpen; -using System.ComponentModel; -using System.Security.Principal; namespace AXOpen.Core { @@ -12,4 +6,30 @@ public partial class AxoTextList { } -} \ No newline at end of file + public class WarningLevelAttribute : Attribute + { + public WarningLevelAttribute() + { + } + public WarningLevelAttribute(uint level) + { + Level = level; + } + + public uint Level { get; } + } + + public class ErrorLevelAttribute : Attribute + { + public ErrorLevelAttribute() + { + } + public ErrorLevelAttribute(uint level) + { + Level = level; + } + + public uint Level { get; } + } + +} diff --git a/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st b/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st index f6ec6189c..47accc955 100644 --- a/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st +++ b/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st @@ -11,7 +11,15 @@ NAMESPACE AxoTextListExample _set2zeroTask : AXOpen.Core.AxoTask; {#ix-set:AttributeName = "Description: |[[1]Description]|"} - _myTextList : AXOpen.Core.AxoTextList; + {#ix-attr:[WarningLevel(600)]} + {#ix-attr:[ErrorLevel(700)]} + _myTextList1 : AXOpen.Core.AxoTextList; + {#ix-set:AttributeName = "Same description: |[[1]Description]|"} + {#ix-attr:[WarningLevel(300)]} + {#ix-attr:[ErrorLevel(500)]} + _myTextList2 : AXOpen.Core.AxoTextList; + {#ix-set:AttributeName = "Totaly different description without error elevation: |[[1]Description3]|"} + _myTextList3 : AXOpen.Core.AxoTextList; END_VAR METHOD PROTECTED OVERRIDE Main @@ -19,15 +27,17 @@ NAMESPACE AxoTextListExample _set2zeroTask.Initialize(THIS); IF(_incrementTask.Execute()) THEN - _myTextList.Id := _myTextList.Id + UINT#1; - _incrementTask.DoneWhen(_myTextList.Id>= UINT#1000); + _myTextList1.Id := _myTextList1.Id + UINT#1; + _incrementTask.DoneWhen(_myTextList1.Id>= UINT#1000); END_IF; IF(_set2zeroTask.Execute()) THEN _incrementTask.Restore(); - _myTextList.Id := UINT#0; + _myTextList1.Id := UINT#0; _set2zeroTask.DoneWhen(TRUE); END_IF; - END_METHOD + _myTextList2.Id := _myTextList1.Id; + _myTextList3.Id := _myTextList1.Id; + END_METHOD END_CLASS END_NAMESPACE diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor index 328d32b92..2a7f26a16 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor @@ -18,7 +18,13 @@
    - + +
    +
    + +
    +
    +
    diff --git a/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs b/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs index 6e0263dce..6c777c282 100644 --- a/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs +++ b/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs @@ -3,6 +3,7 @@ public partial class AxoTextListExampleContext : AXOpen.Core.AxoContext { Dictionary descriptionDict = new Dictionary(); + Dictionary descriptionDict3 = new Dictionary(); public string Description { @@ -19,7 +20,7 @@ public string Description } string description = " "; - if (descriptionDict.TryGetValue(_myTextList.Id.LastValue, out description)) + if (descriptionDict.TryGetValue(_myTextList1.Id.LastValue, out description)) { return description; } @@ -31,6 +32,32 @@ public string Description } } + public string Description3 + { + get + { + if (descriptionDict3 == null) { descriptionDict3 = new Dictionary(); } + if (descriptionDict3.Count == 0) + { + descriptionDict3.Add(0, " "); + for (int i = 1; i < 1000; i++) + { + descriptionDict3.Add((uint)i, "Item from the totally different text list : " + i.ToString()); + } + + } + string description3 = " "; + if (descriptionDict3.TryGetValue(_myTextList3.Id.LastValue, out description3)) + { + return description3; + } + else + + { + return " "; + } + } + } } } From 7fee037ca078ec284e77d09d76638dde17aa8d1f Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 3 Aug 2023 21:15:34 +0200 Subject: [PATCH 26/32] AxoTextList docu added --- docfx/articles/core/AXOTEXTLIST.md | 35 +++++++++++++ docfx/articles/toc.yml | 2 + docfx/images/AxoTextList.PNG | Bin 0 -> 15540 bytes .../AxoTextList/AxoTextListExample.st | 13 +++-- .../AxoTextList/AxoTextListExample.razor | 8 +-- .../AxoTextListExampleContext.cs | 49 ++++++++++-------- 6 files changed, 79 insertions(+), 28 deletions(-) create mode 100644 docfx/articles/core/AXOTEXTLIST.md create mode 100644 docfx/images/AxoTextList.PNG diff --git a/docfx/articles/core/AXOTEXTLIST.md b/docfx/articles/core/AXOTEXTLIST.md new file mode 100644 index 000000000..141f4d76b --- /dev/null +++ b/docfx/articles/core/AXOTEXTLIST.md @@ -0,0 +1,35 @@ +# AxoTextList + +AxoTextList provides displaying the string value from the list defined in the extended class inside the `.NET` twin based on the numerical value read out from the PLC. +Moreover, the display form could also change the background colour with the numerical value change. To achieve this, the attributes `WarningLevel` and `ErrorLevel` need to be declared as in the following example. +[!code-smalltalk[](../../../src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st?name=AxoTextListWithLevelsDefined)] +The final text displayed in the UI application will be `static prefix`+[`text value from text list`(Id)](for example `Description : ` + [TextList(Id)]). +The static prefix is optional. Use the following example to display the same text list without static prefix and with different levels. +[!code-smalltalk[](../../../src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st?name=AxoTextListWithoutPrefix)] +If the `WarningLevel` is greater than 0 and the `ErrorLevel` is greater than the `WarningLevel`, all items with the `Id` lower than the `WarningLevel` are displayed with the `Primary` background, all items with the `Id` greater or equal to the `WarningLevel` and lower then the `ErrorLevel` are displayed with the `Warning` background and all the rest are displayed with the `Danger` background. The final colours depend on the style used. +If the attributes `WarningLevel` and `ErrorLevel` are not declared as in the following example, all items are displayed with the `Primary` background. +[!code-smalltalk[](../../../src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st?name=AxoTextListWithoutLevelsDefined)] + +For each `AxoTextList`, there must be a defined property, named exactly as in the `Attributes` inside the examples above. It must be defined in the extended class that the particular `AxoTextList` is a member of. +This property must return a string value from the dictionary defined in the same class based on the numerical value of the `Id` variable. + +Declaration of the dictionary: +[!code-csharp[](../../../src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs?name=DeclarationOfTheDictionary)] + +Filling the items of the dictionary: +[!code-csharp[](../../../src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs?name=FillingTheItemsOfTheDictionary)] + +Returning the string item from the dictionary: +[!code-csharp[](../../../src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs?name=ReturningTheItemBasedOnId)] + +Complete example for two different `AxoTextList`: +[!code-csharp[](../../../src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs?range=1-71)] + +**How to visualize `AxoTextList`** + +On the UI side, to visualize the `AxoTextList`, use the `RenderableContentControl` and set its Context according to the placement of the instance of the `AxoTextList`. +[!code-csharp[](../../../src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor?name=UI)] + +The displayed result should look like this: + +![Alt text](~/images/AxoTextListExampleVisu.gif) diff --git a/docfx/articles/toc.yml b/docfx/articles/toc.yml index 057a67786..497eafe1e 100644 --- a/docfx/articles/toc.yml +++ b/docfx/articles/toc.yml @@ -27,6 +27,8 @@ href: ~/articles/core/AXODIALOG.md - name: AxoAlertDialog href: ~/articles/core/AXOALERTDIALOG.md + - name: AxoTestList + href: ~/articles/core/AXOTEXTLIST.md - name: AXOpen.Data href: ~/articles/data/README.md items: diff --git a/docfx/images/AxoTextList.PNG b/docfx/images/AxoTextList.PNG new file mode 100644 index 0000000000000000000000000000000000000000..df11c18235c14fcfc4acd2a4147e62a2070f18d1 GIT binary patch literal 15540 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 i|GFrbH>#My*7j>L@0&lIz + {#ix-set:AttributeName = "Description: |[[1]TextList]|"} {#ix-attr:[WarningLevel(600)]} {#ix-attr:[ErrorLevel(700)]} _myTextList1 : AXOpen.Core.AxoTextList; - {#ix-set:AttributeName = "Same description: |[[1]Description]|"} + // + // + {#ix-set:AttributeName = "|[[1]TextList]|"} {#ix-attr:[WarningLevel(300)]} {#ix-attr:[ErrorLevel(500)]} _myTextList2 : AXOpen.Core.AxoTextList; - {#ix-set:AttributeName = "Totaly different description without error elevation: |[[1]Description3]|"} + // + // + {#ix-set:AttributeName = "Totaly different description without error elevation: |[[1]DifferentTextList]|"} _myTextList3 : AXOpen.Core.AxoTextList; + // END_VAR METHOD PROTECTED OVERRIDE Main diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor index 2a7f26a16..b01ee852c 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoTextList/AxoTextListExample.razor @@ -17,15 +17,17 @@ +//
    - +
    - +
    - +
    +//
    diff --git a/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs b/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs index 6c777c282..d9bb8bf94 100644 --- a/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs +++ b/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs @@ -1,55 +1,62 @@ -namespace AxoTextListExample + +using System.Collections.Generic; + +namespace AxoTextListExample { public partial class AxoTextListExampleContext : AXOpen.Core.AxoContext { - Dictionary descriptionDict = new Dictionary(); - Dictionary descriptionDict3 = new Dictionary(); - - public string Description + // + Dictionary textList = new Dictionary(); + // + public string TextList { get { - if (descriptionDict == null) { descriptionDict = new Dictionary(); } - if (descriptionDict.Count == 0) + // + if (textList == null) { textList = new Dictionary(); } + if (textList.Count == 0) { - descriptionDict.Add(0, " "); + textList.Add(0, " "); for (int i = 1; i < 1000; i++) { - descriptionDict.Add((uint)i, "Text list item : " + i.ToString()); + textList.Add((uint)i, "Text list item : " + i.ToString()); } } - string description = " "; - if (descriptionDict.TryGetValue(_myTextList1.Id.LastValue, out description)) + // + // + string _textItem = " "; + if (textList.TryGetValue(_myTextList1.Id.LastValue, out _textItem)) { - return description; + return _textItem; } else - { return " "; } + // } } - public string Description3 + Dictionary differentTextList = new Dictionary(); + public string DifferentTextList { get { - if (descriptionDict3 == null) { descriptionDict3 = new Dictionary(); } - if (descriptionDict3.Count == 0) + if (differentTextList == null) { differentTextList = new Dictionary(); } + if (differentTextList.Count == 0) { - descriptionDict3.Add(0, " "); + differentTextList.Add(0, " "); for (int i = 1; i < 1000; i++) { - descriptionDict3.Add((uint)i, "Item from the totally different text list : " + i.ToString()); + differentTextList.Add((uint)i, "Item from the totally different text list : " + i.ToString()); } } - string description3 = " "; - if (descriptionDict3.TryGetValue(_myTextList3.Id.LastValue, out description3)) + string differentTextItem = " "; + if (differentTextList.TryGetValue(_myTextList3.Id.LastValue, out differentTextItem)) { - return description3; + return differentTextItem; } else From 8f01672a1a38159b1333d29ac3042c681676b473 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Fri, 4 Aug 2023 11:58:00 +0200 Subject: [PATCH 27/32] Continous reading mechanism added for AxoDatamanReader --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 19 +++++++++++++++++++ .../AxoDataman/v_6_0_0/AxoDataman.cs | 1 + 2 files changed, 20 insertions(+) diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index eb1dea70a..418f3bd31 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -251,6 +251,21 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IsValidReferences := TRUE; END_IF; END_METHOD + + METHOD PRIVATE ContinuousReading + VAR_INPUT + refResults : REF_TO AxoDataman_Results; + refResultData : REF_TO ARRAY[*] OF BYTE; + END_VAR + + IF _ResultsStatus.ResultsAvailable AND NOT _ResultsControl.ResultsAcknowledge AND Results.Code > UINT#0 AND Results.Length > UINT#0 THEN + System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); + Status.Action.Id := UINT#708; + END_IF; + + _ResultsControl.ResultsAcknowledge := _ResultsStatus.ResultsAvailable; + END_METHOD + METHOD PROTECTED OVERRIDE Open SUPER.Open(); END_METHOD @@ -324,6 +339,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.UpdateInputs(refAcquisitionStatus,refResultsStatus,refSoftEventStatus,refResultData); + IF Config.ContinuousReading THEN + THIS.ContinuousReading(REF(Results),refResultData); + END_IF; + //*************RESTORE******************** _taskDisabled := FALSE; _restoreTask.IsDisabled := _taskDisabled; diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index 7cd8a5967..48a139046 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -72,6 +72,7 @@ public string ActionDescription actionDescriptionDict.Add(304 ,"Reading started."); actionDescriptionDict.Add(305 ,"Reading running."); actionDescriptionDict.Add(306 ,"Reading was completed successfully."); + actionDescriptionDict.Add(307 ,"New data read."); actionDescriptionDict.Add(600 ,"Clearing of the result data was aborted, while not yet completed!"); From 0d04a2cb9d66d755ad0dab4525b6cd8c3874a29f Mon Sep 17 00:00:00 2001 From: TomKovac Date: Fri, 4 Aug 2023 17:30:21 +0200 Subject: [PATCH 28/32] dataman reader some bug fixed --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 2 +- .../AxoDataman/v_6_0_0/AxoDataman.cs | 2 +- src/integrations/ctrl/apax.yml | 31 +++++++++------ src/integrations/ctrl/dataman_continous.mon | 5 +++ src/templates.simple/ctrl/apax.yml | 39 ++++++++++++++++++- 5 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 src/integrations/ctrl/dataman_continous.mon diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 418f3bd31..039706f3a 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -260,7 +260,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _ResultsStatus.ResultsAvailable AND NOT _ResultsControl.ResultsAcknowledge AND Results.Code > UINT#0 AND Results.Length > UINT#0 THEN System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); - Status.Action.Id := UINT#708; + Status.Action.Id := UINT#307; END_IF; _ResultsControl.ResultsAcknowledge := _ResultsStatus.ResultsAvailable; diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index 48a139046..e4f510022 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -72,7 +72,7 @@ public string ActionDescription actionDescriptionDict.Add(304 ,"Reading started."); actionDescriptionDict.Add(305 ,"Reading running."); actionDescriptionDict.Add(306 ,"Reading was completed successfully."); - actionDescriptionDict.Add(307 ,"New data read."); + actionDescriptionDict.Add(307 ,"Continous reading active: New data read."); actionDescriptionDict.Add(600 ,"Clearing of the result data was aborted, while not yet completed!"); diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index 087b648bb..5837903a3 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -1,30 +1,23 @@ name: "axopen.integrations" version: '0.1.4-alpha.79' type: app -targets: - #- "1500" - - plcsim - - axunit-llvm devDependencies: "@ax/sdk": ^4.0.3 "@ax/sld": ^0.15.9 dependencies: "@ix-ax/axopen.data": '0.1.4-alpha.79' "@ix-ax/axopen.probers": '0.1.4-alpha.79' - "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' + "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' "@ax/system-serde": ^2.0.2 - variables: - APAX_BUILD_ARGS: [ -d ] - + APAX_BUILD_ARGS: [-d] scripts: ixc: - dotnet tool restore - dotnet ixc download: - - apax sld --accept-security-disclaimer -t $AXTARGET -i - $AXTARGETPLATFORMINPUT -r --default-server-interface + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface check+download: | if [ $AXTARGET ]; then if [ $AXTARGETPLATFORMINPUT ]; then @@ -44,11 +37,23 @@ scripts: - apax install - apax build - apax download + update-targets: | + if [ $AXBUILDTARGET_1 ]; then + yq -i "del(.targets)" apax.yml + yq -i ".targets[0] = strenv(AXBUILDTARGET_1)" apax.yml + if [ $AXBUILDTARGET_2 ]; then + yq -i ".targets[1] = strenv(AXBUILDTARGET_2)" apax.yml + fi + if [ $AXBUILDTARGET_3 ]; then + yq -i ".targets[2] = strenv(AXBUILDTARGET_3)" apax.yml + fi + fi + prebuild: + - apax update-targets postbuild: - apax ixc watch: - - dotnet watch --project - ..\\src\\AXOpen.Integrations.Blazor\\axopen_integrations_blazor.csproj + - dotnet watch --project ..\\src\\AXOpen.Integrations.Blazor\\axopen_integrations_blazor.csproj rr: - apax build - apax download @@ -59,3 +64,5 @@ scripts: - apax rr da: - apax do-it-all +targets: + - "1500" diff --git a/src/integrations/ctrl/dataman_continous.mon b/src/integrations/ctrl/dataman_continous.mon new file mode 100644 index 000000000..cab278886 --- /dev/null +++ b/src/integrations/ctrl/dataman_continous.mon @@ -0,0 +1,5 @@ +AxoCognexVisionDatamanExampleContext.MyDataman.Config.ContinuousReading +AxoCognexVisionDatamanExampleContext.MyDataman._ResultsStatus.ResultsAvailable +AxoCognexVisionDatamanExampleContext.MyDataman. _ResultsControl.ResultsAcknowledge +AxoCognexVisionDatamanExampleContext.MyDataman.Results.Code +AxoCognexVisionDatamanExampleContext.MyDataman.Results.Length diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index d6cceb8ea..d1138bc22 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -22,17 +22,52 @@ scripts: - dotnet tool restore --no-cache - dotnet ixc - dotnet ixr + prebuild: + - apax update-targets postbuild: apax ixc download: - apax install - apax build # Here you will need to set the argumen -t to your plc OP and -i to platfrom you are dowloading to # --default-server-interface is a must if you are using WebAPI - - apax sld --accept-security-disclaimer -t 10.10.10.1 -i .\\bin\\1500\\ -r - --default-server-interface + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface watch: - dotnet watch --project ..\\axosimple.app\\axosimple.hmi.csproj da: - apax download - apax watch + check+download: | + if [ $AXTARGET ]; then + if [ $AXTARGETPLATFORMINPUT ]; then + if ping -n 1 $AXTARGET &> /dev/null; then + echo "Downloading from:" $AXTARGETPLATFORMINPUT "=>" $AXTARGET + apax download + else + echo "Target with IP address:" $AXTARGET "is not accessible. No download is going to be performed!!!" + fi + else + echo "Environment variable AXTARGETPLATFORMINPUT not defined!!!" + fi + else + echo "Environment variable AXTARGET not defined!!!" + fi + update-targets: | + if [ $AXBUILDTARGET_1 ]; then + yq -i "del(.targets)" apax.yml + yq -i ".targets[0] = strenv(AXBUILDTARGET_1)" apax.yml + if [ $AXBUILDTARGET_2 ]; then + yq -i ".targets[1] = strenv(AXBUILDTARGET_2)" apax.yml + fi + if [ $AXBUILDTARGET_3 ]; then + yq -i ".targets[2] = strenv(AXBUILDTARGET_3)" apax.yml + fi + fi + rr: + - apax build + - apax download + - apax watch + fr: + - ..\\scripts\\StartPlcSimAdvCli.exe + - apax install + - apax rr From 217470255c9a5bd2aeb5d8f2e2c64eda96eca336 Mon Sep 17 00:00:00 2001 From: TomKovac Date: Mon, 7 Aug 2023 14:11:25 +0200 Subject: [PATCH 29/32] Excessive ResultData size checked --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 12 ++- .../Tasks/AxoDatamanClearResultData.st | 2 + .../v_6_0_0/Tasks/AxoDatamanRead.st | 14 +++- .../AxoDataman/v_6_0_0/AxoDataman.cs | 21 ++--- .../AxoCognexVisionDatamanExample.st | 19 ++++- .../AXOpen.Cognex.Vision/IO/CopyInputs.st | 77 +++++++++++++++++++ .../AXOpen.Cognex.Vision/IO/CopyOutputs.st | 71 +++++++++++++++++ .../AXOpen.Cognex.Vision/IO/HwInputs.st | 4 + .../AXOpen.Cognex.Vision/IO/HwOutputs.st | 4 + .../AXOpen.Cognex.Vision/IO/PlcInputs.st | 12 ++- .../AXOpen.Cognex.Vision/IO/PlcOutputs.st | 12 ++- .../AxoCognexVisionDatamanExample.razor | 20 ++--- 12 files changed, 230 insertions(+), 38 deletions(-) diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 039706f3a..7d9b9111e 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -254,13 +254,19 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PRIVATE ContinuousReading VAR_INPUT + refStatus : REF_TO AxoDataman_Status; refResults : REF_TO AxoDataman_Results; refResultData : REF_TO ARRAY[*] OF BYTE; END_VAR IF _ResultsStatus.ResultsAvailable AND NOT _ResultsControl.ResultsAcknowledge AND Results.Code > UINT#0 AND Results.Length > UINT#0 THEN - System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); - Status.Action.Id := UINT#307; + IF refResults^.Length > TO_UINT(refStatus^.ResultDataSize) THEN + Status.Action.Id := UINT#701; + Status.Error.Id := UINT#712; + ELSE + System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); + Status.Action.Id := UINT#307; + END_IF; END_IF; _ResultsControl.ResultsAcknowledge := _ResultsStatus.ResultsAvailable; @@ -340,7 +346,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.UpdateInputs(refAcquisitionStatus,refResultsStatus,refSoftEventStatus,refResultData); IF Config.ContinuousReading THEN - THIS.ContinuousReading(REF(Results),refResultData); + THIS.ContinuousReading(REF(Status), REF(Results),refResultData); END_IF; //*************RESTORE******************** diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 2bed3e0fe..687210fd8 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -89,6 +89,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore + _Status^.Action.Id := UINT#308; + _Status^.Error.Id := UINT#0; _progress := 0; THIS.CallTimers(FALSE); END_METHOD diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index f891cc69b..5e8822f9e 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -92,9 +92,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 5 THEN - THIS.ThrowWhen(refResults^.Code = UINT#0 OR refResults^.Length=UINT#0 OR refResults^.Length > TO_UINT(refStatus^.ResultDataSize)); - THIS.CallTimers(FALSE); - _progress := _progress + 1; + IF refResults^.Code = UINT#0 OR refResults^.Length=UINT#0 OR refResults^.Length > TO_UINT(refStatus^.ResultDataSize) THEN + THIS.ThrowWhen(TRUE); + IF refResults^.Length > TO_UINT(refStatus^.ResultDataSize) THEN + refStatus^.Error.Id := UINT#712; + END_IF; + ELSE + THIS.CallTimers(FALSE); + _progress := _progress + 1; + END_IF; END_IF; IF _progress = 6 THEN @@ -149,6 +155,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore + _Status^.Action.Id := UINT#309; + _Status^.Error.Id := UINT#0; _progress := 0; THIS.CallTimers(FALSE); END_METHOD diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index e4f510022..bc5a17301 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -42,6 +42,7 @@ public string ErrorDescription errorDescriptionDict.Add(709 ,"Error: ResultData-lower bound index is not zero!"); errorDescriptionDict.Add(710 ,"Error: UserData has invalid size!"); errorDescriptionDict.Add(711 ,"Error: UserData-lower bound index is not zero!"); + errorDescriptionDict.Add(712 ,"Error: The ResultData length exceeds the configured hardware structure's length!"); } string errorDescription = " "; @@ -64,15 +65,17 @@ public string ActionDescription if (actionDescriptionDict == null) { actionDescriptionDict = new Dictionary(); } if (actionDescriptionDict.Count == 0) { - actionDescriptionDict.Add(0 ," "); - actionDescriptionDict.Add(300 ,"Restore executed."); - actionDescriptionDict.Add(301 ,"Clearing of the result data started."); - actionDescriptionDict.Add(302 ,"Clearing of the result data running."); - actionDescriptionDict.Add(303 ,"Clearing of the result data was completed successfully."); - actionDescriptionDict.Add(304 ,"Reading started."); - actionDescriptionDict.Add(305 ,"Reading running."); - actionDescriptionDict.Add(306 ,"Reading was completed successfully."); - actionDescriptionDict.Add(307 ,"Continous reading active: New data read."); + actionDescriptionDict.Add(0, " "); + actionDescriptionDict.Add(300, "Restore executed."); + actionDescriptionDict.Add(301, "Clearing of the result data started."); + actionDescriptionDict.Add(302, "Clearing of the result data running."); + actionDescriptionDict.Add(303, "Clearing of the result data was completed successfully."); + actionDescriptionDict.Add(304, "Reading started."); + actionDescriptionDict.Add(305, "Reading running."); + actionDescriptionDict.Add(306, "Reading was completed successfully."); + actionDescriptionDict.Add(307, "Continous reading active: New data read."); + actionDescriptionDict.Add(308, "Clearing of the result data restored."); + actionDescriptionDict.Add(309, "Reading restored."); actionDescriptionDict.Add(600 ,"Clearing of the result data was aborted, while not yet completed!"); diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index 11e38370b..6661c99e8 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -6,7 +6,9 @@ NAMESPACE AxoCognexVisionDatamanExamples CLASS AxoCognexVisionDatamanExampleContext EXTENDS AXOpen.AxoContext VAR PUBLIC {#ix-set:AttributeName = "10A1"} - MyDataman : AXOpen.Cognex.Vision.v_6_0_0_0.AxoDataman; + MyDataman1 : AXOpen.Cognex.Vision.v_6_0_0_0.AxoDataman; + {#ix-set:AttributeName = "reader_st2"} + MyDataman2 : AXOpen.Cognex.Vision.v_6_0_0_0.AxoDataman; {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; PlcInputs : REF_TO PlcInputs; @@ -16,10 +18,11 @@ NAMESPACE AxoCognexVisionDatamanExamples METHOD PROTECTED OVERRIDE Main // Example of the activation of the manual control. IF ActivateManualControl THEN - MyDataman.ActivateManualControl(); + MyDataman1.ActivateManualControl(); + MyDataman2.ActivateManualControl(); END_IF; // Calling the main method `Run` with respective input and output variables. - MyDataman.Run( parent := THIS, + MyDataman1.Run( parent := THIS, refAcquisitionControl := REF(PlcOutputs^._10a1_Acquisition_Control_1), refAcquisitionStatus := REF(PlcInputs^._10a1_Acquisition_Status_1), refResultsControl := REF(PlcOutputs^._10a1_Results_Control_1), @@ -28,6 +31,16 @@ NAMESPACE AxoCognexVisionDatamanExamples refSoftEventStatus := REF(PlcInputs^._10a1_Soft_Event_Control_1), refResultData := REF(PlcInputs^._10a1_Result_Data_128_bytes_1), refUserData := REF(PlcOutputs^._10a1_User_Data_128_bytes_1)); + + MyDataman2.Run( parent := THIS, + refAcquisitionControl := REF(PlcOutputs^.reader_st2_Acquisition_Control_1), + refAcquisitionStatus := REF(PlcInputs^.reader_st2_Acquisition_Status_1), + refResultsControl := REF(PlcOutputs^.reader_st2_Results_Control_1), + refResultsStatus := REF(PlcInputs^.reader_st2_Results_Status_1), + refSoftEventControl := REF(PlcOutputs^.reader_st2_Soft_Event_Control_1), + refSoftEventStatus := REF(PlcInputs^.reader_st2_Results_Status_1), + refResultData := REF(PlcInputs^.reader_st2_Result_Data_64_bytes_1), + refUserData := REF(PlcOutputs^.reader_st2_User_Data_64_bytes_1)); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st index 4976a7f6e..0826b1aa7 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyInputs.st @@ -144,4 +144,81 @@ FUNCTION CopyInputs PlcInputs._10a1_Result_Data_128_bytes_1[133] := HwInputs._10a1_Result_Data_128_bytes_1[133]; PlcInputs._10a1_Result_Data_128_bytes_1[134] := HwInputs._10a1_Result_Data_128_bytes_1[134]; PlcInputs._10a1_Result_Data_128_bytes_1[135] := HwInputs._10a1_Result_Data_128_bytes_1[135]; + PlcInputs.reader_st2_Acquisition_Status_1[0] := HwInputs.reader_st2_Acquisition_Status_1[0]; + PlcInputs.reader_st2_Acquisition_Status_1[1] := HwInputs.reader_st2_Acquisition_Status_1[1]; + PlcInputs.reader_st2_Acquisition_Status_1[2] := HwInputs.reader_st2_Acquisition_Status_1[2]; + PlcInputs.reader_st2_Results_Status_1 := HwInputs.reader_st2_Results_Status_1; + PlcInputs.reader_st2_Soft_Event_Control_1 := HwInputs.reader_st2_Soft_Event_Control_1; + PlcInputs.reader_st2_Result_Data_64_bytes_1[0] := HwInputs.reader_st2_Result_Data_64_bytes_1[0]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[1] := HwInputs.reader_st2_Result_Data_64_bytes_1[1]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[2] := HwInputs.reader_st2_Result_Data_64_bytes_1[2]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[3] := HwInputs.reader_st2_Result_Data_64_bytes_1[3]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[4] := HwInputs.reader_st2_Result_Data_64_bytes_1[4]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[5] := HwInputs.reader_st2_Result_Data_64_bytes_1[5]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[6] := HwInputs.reader_st2_Result_Data_64_bytes_1[6]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[7] := HwInputs.reader_st2_Result_Data_64_bytes_1[7]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[8] := HwInputs.reader_st2_Result_Data_64_bytes_1[8]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[9] := HwInputs.reader_st2_Result_Data_64_bytes_1[9]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[10] := HwInputs.reader_st2_Result_Data_64_bytes_1[10]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[11] := HwInputs.reader_st2_Result_Data_64_bytes_1[11]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[12] := HwInputs.reader_st2_Result_Data_64_bytes_1[12]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[13] := HwInputs.reader_st2_Result_Data_64_bytes_1[13]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[14] := HwInputs.reader_st2_Result_Data_64_bytes_1[14]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[15] := HwInputs.reader_st2_Result_Data_64_bytes_1[15]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[16] := HwInputs.reader_st2_Result_Data_64_bytes_1[16]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[17] := HwInputs.reader_st2_Result_Data_64_bytes_1[17]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[18] := HwInputs.reader_st2_Result_Data_64_bytes_1[18]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[19] := HwInputs.reader_st2_Result_Data_64_bytes_1[19]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[20] := HwInputs.reader_st2_Result_Data_64_bytes_1[20]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[21] := HwInputs.reader_st2_Result_Data_64_bytes_1[21]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[22] := HwInputs.reader_st2_Result_Data_64_bytes_1[22]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[23] := HwInputs.reader_st2_Result_Data_64_bytes_1[23]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[24] := HwInputs.reader_st2_Result_Data_64_bytes_1[24]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[25] := HwInputs.reader_st2_Result_Data_64_bytes_1[25]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[26] := HwInputs.reader_st2_Result_Data_64_bytes_1[26]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[27] := HwInputs.reader_st2_Result_Data_64_bytes_1[27]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[28] := HwInputs.reader_st2_Result_Data_64_bytes_1[28]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[29] := HwInputs.reader_st2_Result_Data_64_bytes_1[29]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[30] := HwInputs.reader_st2_Result_Data_64_bytes_1[30]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[31] := HwInputs.reader_st2_Result_Data_64_bytes_1[31]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[32] := HwInputs.reader_st2_Result_Data_64_bytes_1[32]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[33] := HwInputs.reader_st2_Result_Data_64_bytes_1[33]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[34] := HwInputs.reader_st2_Result_Data_64_bytes_1[34]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[35] := HwInputs.reader_st2_Result_Data_64_bytes_1[35]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[36] := HwInputs.reader_st2_Result_Data_64_bytes_1[36]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[37] := HwInputs.reader_st2_Result_Data_64_bytes_1[37]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[38] := HwInputs.reader_st2_Result_Data_64_bytes_1[38]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[39] := HwInputs.reader_st2_Result_Data_64_bytes_1[39]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[40] := HwInputs.reader_st2_Result_Data_64_bytes_1[40]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[41] := HwInputs.reader_st2_Result_Data_64_bytes_1[41]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[42] := HwInputs.reader_st2_Result_Data_64_bytes_1[42]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[43] := HwInputs.reader_st2_Result_Data_64_bytes_1[43]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[44] := HwInputs.reader_st2_Result_Data_64_bytes_1[44]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[45] := HwInputs.reader_st2_Result_Data_64_bytes_1[45]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[46] := HwInputs.reader_st2_Result_Data_64_bytes_1[46]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[47] := HwInputs.reader_st2_Result_Data_64_bytes_1[47]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[48] := HwInputs.reader_st2_Result_Data_64_bytes_1[48]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[49] := HwInputs.reader_st2_Result_Data_64_bytes_1[49]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[50] := HwInputs.reader_st2_Result_Data_64_bytes_1[50]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[51] := HwInputs.reader_st2_Result_Data_64_bytes_1[51]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[52] := HwInputs.reader_st2_Result_Data_64_bytes_1[52]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[53] := HwInputs.reader_st2_Result_Data_64_bytes_1[53]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[54] := HwInputs.reader_st2_Result_Data_64_bytes_1[54]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[55] := HwInputs.reader_st2_Result_Data_64_bytes_1[55]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[56] := HwInputs.reader_st2_Result_Data_64_bytes_1[56]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[57] := HwInputs.reader_st2_Result_Data_64_bytes_1[57]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[58] := HwInputs.reader_st2_Result_Data_64_bytes_1[58]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[59] := HwInputs.reader_st2_Result_Data_64_bytes_1[59]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[60] := HwInputs.reader_st2_Result_Data_64_bytes_1[60]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[61] := HwInputs.reader_st2_Result_Data_64_bytes_1[61]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[62] := HwInputs.reader_st2_Result_Data_64_bytes_1[62]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[63] := HwInputs.reader_st2_Result_Data_64_bytes_1[63]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[64] := HwInputs.reader_st2_Result_Data_64_bytes_1[64]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[65] := HwInputs.reader_st2_Result_Data_64_bytes_1[65]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[66] := HwInputs.reader_st2_Result_Data_64_bytes_1[66]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[67] := HwInputs.reader_st2_Result_Data_64_bytes_1[67]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[68] := HwInputs.reader_st2_Result_Data_64_bytes_1[68]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[69] := HwInputs.reader_st2_Result_Data_64_bytes_1[69]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[70] := HwInputs.reader_st2_Result_Data_64_bytes_1[70]; + PlcInputs.reader_st2_Result_Data_64_bytes_1[71] := HwInputs.reader_st2_Result_Data_64_bytes_1[71]; END_FUNCTION diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st index 8d2e266c0..74838859d 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/CopyOutputs.st @@ -138,4 +138,75 @@ FUNCTION CopyOutputs HwOutputs._10a1_User_Data_128_bytes_1[129] := PlcOutputs._10a1_User_Data_128_bytes_1[129]; HwOutputs._10a1_User_Data_128_bytes_1[130] := PlcOutputs._10a1_User_Data_128_bytes_1[130]; HwOutputs._10a1_User_Data_128_bytes_1[131] := PlcOutputs._10a1_User_Data_128_bytes_1[131]; + HwOutputs.reader_st2_Acquisition_Control_1 := PlcOutputs.reader_st2_Acquisition_Control_1; + HwOutputs.reader_st2_Results_Control_1 := PlcOutputs.reader_st2_Results_Control_1; + HwOutputs.reader_st2_Soft_Event_Control_1 := PlcOutputs.reader_st2_Soft_Event_Control_1; + HwOutputs.reader_st2_User_Data_64_bytes_1[0] := PlcOutputs.reader_st2_User_Data_64_bytes_1[0]; + HwOutputs.reader_st2_User_Data_64_bytes_1[1] := PlcOutputs.reader_st2_User_Data_64_bytes_1[1]; + HwOutputs.reader_st2_User_Data_64_bytes_1[2] := PlcOutputs.reader_st2_User_Data_64_bytes_1[2]; + HwOutputs.reader_st2_User_Data_64_bytes_1[3] := PlcOutputs.reader_st2_User_Data_64_bytes_1[3]; + HwOutputs.reader_st2_User_Data_64_bytes_1[4] := PlcOutputs.reader_st2_User_Data_64_bytes_1[4]; + HwOutputs.reader_st2_User_Data_64_bytes_1[5] := PlcOutputs.reader_st2_User_Data_64_bytes_1[5]; + HwOutputs.reader_st2_User_Data_64_bytes_1[6] := PlcOutputs.reader_st2_User_Data_64_bytes_1[6]; + HwOutputs.reader_st2_User_Data_64_bytes_1[7] := PlcOutputs.reader_st2_User_Data_64_bytes_1[7]; + HwOutputs.reader_st2_User_Data_64_bytes_1[8] := PlcOutputs.reader_st2_User_Data_64_bytes_1[8]; + HwOutputs.reader_st2_User_Data_64_bytes_1[9] := PlcOutputs.reader_st2_User_Data_64_bytes_1[9]; + HwOutputs.reader_st2_User_Data_64_bytes_1[10] := PlcOutputs.reader_st2_User_Data_64_bytes_1[10]; + HwOutputs.reader_st2_User_Data_64_bytes_1[11] := PlcOutputs.reader_st2_User_Data_64_bytes_1[11]; + HwOutputs.reader_st2_User_Data_64_bytes_1[12] := PlcOutputs.reader_st2_User_Data_64_bytes_1[12]; + HwOutputs.reader_st2_User_Data_64_bytes_1[13] := PlcOutputs.reader_st2_User_Data_64_bytes_1[13]; + HwOutputs.reader_st2_User_Data_64_bytes_1[14] := PlcOutputs.reader_st2_User_Data_64_bytes_1[14]; + HwOutputs.reader_st2_User_Data_64_bytes_1[15] := PlcOutputs.reader_st2_User_Data_64_bytes_1[15]; + HwOutputs.reader_st2_User_Data_64_bytes_1[16] := PlcOutputs.reader_st2_User_Data_64_bytes_1[16]; + HwOutputs.reader_st2_User_Data_64_bytes_1[17] := PlcOutputs.reader_st2_User_Data_64_bytes_1[17]; + HwOutputs.reader_st2_User_Data_64_bytes_1[18] := PlcOutputs.reader_st2_User_Data_64_bytes_1[18]; + HwOutputs.reader_st2_User_Data_64_bytes_1[19] := PlcOutputs.reader_st2_User_Data_64_bytes_1[19]; + HwOutputs.reader_st2_User_Data_64_bytes_1[20] := PlcOutputs.reader_st2_User_Data_64_bytes_1[20]; + HwOutputs.reader_st2_User_Data_64_bytes_1[21] := PlcOutputs.reader_st2_User_Data_64_bytes_1[21]; + HwOutputs.reader_st2_User_Data_64_bytes_1[22] := PlcOutputs.reader_st2_User_Data_64_bytes_1[22]; + HwOutputs.reader_st2_User_Data_64_bytes_1[23] := PlcOutputs.reader_st2_User_Data_64_bytes_1[23]; + HwOutputs.reader_st2_User_Data_64_bytes_1[24] := PlcOutputs.reader_st2_User_Data_64_bytes_1[24]; + HwOutputs.reader_st2_User_Data_64_bytes_1[25] := PlcOutputs.reader_st2_User_Data_64_bytes_1[25]; + HwOutputs.reader_st2_User_Data_64_bytes_1[26] := PlcOutputs.reader_st2_User_Data_64_bytes_1[26]; + HwOutputs.reader_st2_User_Data_64_bytes_1[27] := PlcOutputs.reader_st2_User_Data_64_bytes_1[27]; + HwOutputs.reader_st2_User_Data_64_bytes_1[28] := PlcOutputs.reader_st2_User_Data_64_bytes_1[28]; + HwOutputs.reader_st2_User_Data_64_bytes_1[29] := PlcOutputs.reader_st2_User_Data_64_bytes_1[29]; + HwOutputs.reader_st2_User_Data_64_bytes_1[30] := PlcOutputs.reader_st2_User_Data_64_bytes_1[30]; + HwOutputs.reader_st2_User_Data_64_bytes_1[31] := PlcOutputs.reader_st2_User_Data_64_bytes_1[31]; + HwOutputs.reader_st2_User_Data_64_bytes_1[32] := PlcOutputs.reader_st2_User_Data_64_bytes_1[32]; + HwOutputs.reader_st2_User_Data_64_bytes_1[33] := PlcOutputs.reader_st2_User_Data_64_bytes_1[33]; + HwOutputs.reader_st2_User_Data_64_bytes_1[34] := PlcOutputs.reader_st2_User_Data_64_bytes_1[34]; + HwOutputs.reader_st2_User_Data_64_bytes_1[35] := PlcOutputs.reader_st2_User_Data_64_bytes_1[35]; + HwOutputs.reader_st2_User_Data_64_bytes_1[36] := PlcOutputs.reader_st2_User_Data_64_bytes_1[36]; + HwOutputs.reader_st2_User_Data_64_bytes_1[37] := PlcOutputs.reader_st2_User_Data_64_bytes_1[37]; + HwOutputs.reader_st2_User_Data_64_bytes_1[38] := PlcOutputs.reader_st2_User_Data_64_bytes_1[38]; + HwOutputs.reader_st2_User_Data_64_bytes_1[39] := PlcOutputs.reader_st2_User_Data_64_bytes_1[39]; + HwOutputs.reader_st2_User_Data_64_bytes_1[40] := PlcOutputs.reader_st2_User_Data_64_bytes_1[40]; + HwOutputs.reader_st2_User_Data_64_bytes_1[41] := PlcOutputs.reader_st2_User_Data_64_bytes_1[41]; + HwOutputs.reader_st2_User_Data_64_bytes_1[42] := PlcOutputs.reader_st2_User_Data_64_bytes_1[42]; + HwOutputs.reader_st2_User_Data_64_bytes_1[43] := PlcOutputs.reader_st2_User_Data_64_bytes_1[43]; + HwOutputs.reader_st2_User_Data_64_bytes_1[44] := PlcOutputs.reader_st2_User_Data_64_bytes_1[44]; + HwOutputs.reader_st2_User_Data_64_bytes_1[45] := PlcOutputs.reader_st2_User_Data_64_bytes_1[45]; + HwOutputs.reader_st2_User_Data_64_bytes_1[46] := PlcOutputs.reader_st2_User_Data_64_bytes_1[46]; + HwOutputs.reader_st2_User_Data_64_bytes_1[47] := PlcOutputs.reader_st2_User_Data_64_bytes_1[47]; + HwOutputs.reader_st2_User_Data_64_bytes_1[48] := PlcOutputs.reader_st2_User_Data_64_bytes_1[48]; + HwOutputs.reader_st2_User_Data_64_bytes_1[49] := PlcOutputs.reader_st2_User_Data_64_bytes_1[49]; + HwOutputs.reader_st2_User_Data_64_bytes_1[50] := PlcOutputs.reader_st2_User_Data_64_bytes_1[50]; + HwOutputs.reader_st2_User_Data_64_bytes_1[51] := PlcOutputs.reader_st2_User_Data_64_bytes_1[51]; + HwOutputs.reader_st2_User_Data_64_bytes_1[52] := PlcOutputs.reader_st2_User_Data_64_bytes_1[52]; + HwOutputs.reader_st2_User_Data_64_bytes_1[53] := PlcOutputs.reader_st2_User_Data_64_bytes_1[53]; + HwOutputs.reader_st2_User_Data_64_bytes_1[54] := PlcOutputs.reader_st2_User_Data_64_bytes_1[54]; + HwOutputs.reader_st2_User_Data_64_bytes_1[55] := PlcOutputs.reader_st2_User_Data_64_bytes_1[55]; + HwOutputs.reader_st2_User_Data_64_bytes_1[56] := PlcOutputs.reader_st2_User_Data_64_bytes_1[56]; + HwOutputs.reader_st2_User_Data_64_bytes_1[57] := PlcOutputs.reader_st2_User_Data_64_bytes_1[57]; + HwOutputs.reader_st2_User_Data_64_bytes_1[58] := PlcOutputs.reader_st2_User_Data_64_bytes_1[58]; + HwOutputs.reader_st2_User_Data_64_bytes_1[59] := PlcOutputs.reader_st2_User_Data_64_bytes_1[59]; + HwOutputs.reader_st2_User_Data_64_bytes_1[60] := PlcOutputs.reader_st2_User_Data_64_bytes_1[60]; + HwOutputs.reader_st2_User_Data_64_bytes_1[61] := PlcOutputs.reader_st2_User_Data_64_bytes_1[61]; + HwOutputs.reader_st2_User_Data_64_bytes_1[62] := PlcOutputs.reader_st2_User_Data_64_bytes_1[62]; + HwOutputs.reader_st2_User_Data_64_bytes_1[63] := PlcOutputs.reader_st2_User_Data_64_bytes_1[63]; + HwOutputs.reader_st2_User_Data_64_bytes_1[64] := PlcOutputs.reader_st2_User_Data_64_bytes_1[64]; + HwOutputs.reader_st2_User_Data_64_bytes_1[65] := PlcOutputs.reader_st2_User_Data_64_bytes_1[65]; + HwOutputs.reader_st2_User_Data_64_bytes_1[66] := PlcOutputs.reader_st2_User_Data_64_bytes_1[66]; + HwOutputs.reader_st2_User_Data_64_bytes_1[67] := PlcOutputs.reader_st2_User_Data_64_bytes_1[67]; END_FUNCTION diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st index b7df6729a..499dff12e 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwInputs.st @@ -4,5 +4,9 @@ TYPE _10a1_Results_Status_1 AT %B85 : BYTE; _10a1_Soft_Event_Control_1 AT %B86 : BYTE; _10a1_Result_Data_128_bytes_1 AT %B87 : ARRAY[0..135] OF BYTE; + reader_st2_Acquisition_Status_1 AT %B300 : ARRAY[0..2] OF BYTE; + reader_st2_Results_Status_1 AT %B303 : BYTE; + reader_st2_Soft_Event_Control_1 AT %B304 : BYTE; + reader_st2_Result_Data_64_bytes_1 AT %B305 : ARRAY[0..71] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st index 6c930f523..d58fe24d8 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/HwOutputs.st @@ -4,5 +4,9 @@ TYPE _10a1_Results_Control_1 AT %B73 : BYTE; _10a1_Soft_Event_Control_1 AT %B74 : BYTE; _10a1_User_Data_128_bytes_1 AT %B75 : ARRAY[0..131] OF BYTE; + reader_st2_Acquisition_Control_1 AT %B300 : BYTE; + reader_st2_Results_Control_1 AT %B301 : BYTE; + reader_st2_Soft_Event_Control_1 AT %B302 : BYTE; + reader_st2_User_Data_64_bytes_1 AT %B303 : ARRAY[0..67] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st index 97b3efc59..ff2f73028 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcInputs.st @@ -1,8 +1,12 @@ TYPE PlcInputs : STRUCT - _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; - _10a1_Results_Status_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + _10a1_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + _10a1_Results_Status_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_Result_Data_128_bytes_1 : ARRAY[0..135] OF BYTE; + reader_st2_Acquisition_Status_1 : ARRAY[0..2] OF BYTE; + reader_st2_Results_Status_1 : BYTE; + reader_st2_Soft_Event_Control_1 : BYTE; + reader_st2_Result_Data_64_bytes_1 : ARRAY[0..71] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st index 6389c2461..615bda58b 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/IO/PlcOutputs.st @@ -1,8 +1,12 @@ TYPE PlcOutputs : STRUCT - _10a1_Acquisition_Control_1 : BYTE; - _10a1_Results_Control_1 : BYTE; - _10a1_Soft_Event_Control_1 : BYTE; - _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + _10a1_Acquisition_Control_1 : BYTE; + _10a1_Results_Control_1 : BYTE; + _10a1_Soft_Event_Control_1 : BYTE; + _10a1_User_Data_128_bytes_1 : ARRAY[0..131] OF BYTE; + reader_st2_Acquisition_Control_1 : BYTE; + reader_st2_Results_Control_1 : BYTE; + reader_st2_Soft_Event_Control_1 : BYTE; + reader_st2_User_Data_64_bytes_1 : ARRAY[0..67] OF BYTE; END_STRUCT; END_TYPE diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor index 6cebcf736..8b1638448 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor +++ b/src/integrations/src/AXOpen.Integrations.Blazor/Pages/AxoCognexVision/AxoCognexVisionDatamanExample.razor @@ -15,22 +15,18 @@
    - +
    - - -@*
    - ActionDescription: @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ActionDescription.ToString() +
    -
    - ErrorDescription: @Entry.Plc.AxoCognexVisionDatamanExampleContext.MyDataman.Status.ErrorDescription.ToString() -
    -
    *@ - - + + +
    + +
    - +
    From 80c986ceb99a02ac6d5a44c1c919ec0803e874fb Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Mon, 7 Aug 2023 20:27:57 +0200 Subject: [PATCH 30/32] AxoDataman documentation added --- .../AXOPENCOGNEVISION_V_6_0_0_0.md | 30 +++++++++++++++++++ .../components/AXOPENCOGNEVISION/README.md | 7 +++++ docfx/articles/components/README.md | 9 ++++++ .../{giudelines => guidelines}/Conventions.md | 0 .../componets.md => guidelines/components.md} | 0 docfx/articles/toc.yml | 8 +++++ .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 15 +++++++--- src/integrations/ctrl/apax.yml | 2 +- .../AxoCognexVisionDatamanExample.st | 24 +++++++++++++-- src/templates.simple/ctrl/apax.yml | 13 ++++---- 10 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 docfx/articles/components/AXOPENCOGNEVISION/AXOPENCOGNEVISION_V_6_0_0_0.md create mode 100644 docfx/articles/components/AXOPENCOGNEVISION/README.md create mode 100644 docfx/articles/components/README.md rename docfx/articles/{giudelines => guidelines}/Conventions.md (100%) rename docfx/articles/{giudelines/componets.md => guidelines/components.md} (100%) diff --git a/docfx/articles/components/AXOPENCOGNEVISION/AXOPENCOGNEVISION_V_6_0_0_0.md b/docfx/articles/components/AXOPENCOGNEVISION/AXOPENCOGNEVISION_V_6_0_0_0.md new file mode 100644 index 000000000..6591e06fe --- /dev/null +++ b/docfx/articles/components/AXOPENCOGNEVISION/AXOPENCOGNEVISION_V_6_0_0_0.md @@ -0,0 +1,30 @@ +# AXOpenCognexVision + +The `AXOpenCognexVision` library controls and operates the vision devices from the manufacturer `Cognex`. + + +## AxoDataman + +`AxoDataman` provides the essential control and operation of all code-reader of the `Dataman` family. + +### Implementation +The `AxoDataman` is designed to be used as a member of the `AxoContext` or `AxoObject`. +Therefore its instance must be initialized with the proper `AxoContext` or `AxoObject` before any use. +Also, the hardware signals must be assigned first before calling any method of this instance. +To accomplish this, call the `Run` method cyclically with the proper variables (i.e. inside the `Main` method of the relevant `AxoContext`) as in the example below: + +**Example of the initialization and hardware signal assignement** +[!code-smalltalk[](../../../../src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st?name=HWIO_Assignement)] + +There are three public methods to operate the `AxoDataman`: + +`Restore` - restores the state of the `AxoDataman` to the initial state and resets all the internal variables. + +`ClearResultData` - resets the data read and confirms the data received from the device. +**Example of using ClearResultData method** +[!code-smalltalk[](../../../../src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st?name=ClearResultData)] + +`Read` - triggers the reading sequence and waits for results. +**Example of using Read method** +[!code-smalltalk[](../../../../src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st?name=Read)] + diff --git a/docfx/articles/components/AXOPENCOGNEVISION/README.md b/docfx/articles/components/AXOPENCOGNEVISION/README.md new file mode 100644 index 000000000..0d368dae1 --- /dev/null +++ b/docfx/articles/components/AXOPENCOGNEVISION/README.md @@ -0,0 +1,7 @@ +# AXOpenCognexVision + +The `AXOpenCognexVision` library controls and operates the vision devices from the manufacturer `Cognex`. + +# VERSIONS +[!INCLUDE [V_6_0_0_0](AXOPENCOGNEVISION_V_6_0_0_0.md)] + diff --git a/docfx/articles/components/README.md b/docfx/articles/components/README.md new file mode 100644 index 000000000..10f398e3f --- /dev/null +++ b/docfx/articles/components/README.md @@ -0,0 +1,9 @@ +#**AXOpen.Components** + +**AXOpen.Components** is a group of libraries providing control of the individual types of devices grouped by the +manufacturer and the function group. + +# General rules and conventions +[!INCLUDE [Conventions](../guidelines/components.md)] +[!INCLUDE [AXOPENCOGNEVISION](AXOPENCOGNEVISION/README.md)] + diff --git a/docfx/articles/giudelines/Conventions.md b/docfx/articles/guidelines/Conventions.md similarity index 100% rename from docfx/articles/giudelines/Conventions.md rename to docfx/articles/guidelines/Conventions.md diff --git a/docfx/articles/giudelines/componets.md b/docfx/articles/guidelines/components.md similarity index 100% rename from docfx/articles/giudelines/componets.md rename to docfx/articles/guidelines/components.md diff --git a/docfx/articles/toc.yml b/docfx/articles/toc.yml index 497eafe1e..1d1676727 100644 --- a/docfx/articles/toc.yml +++ b/docfx/articles/toc.yml @@ -41,6 +41,14 @@ items: - name: AxoMessenger href: ~/articles/messaging/AXOMESSENGER.md +- name: AXOpen.Components + href: ~/articles/components/README.md + items: + - name: AxoCognexVision + href: ~/articles/components/AXOPENCOGNEVISION/README.md + items: + - name: V_6_0_0_0 + href: ~/articles/components/AXOPENCOGNEVISION/AXOPENCOGNEVISION_V_6_0_0_0.md - name: AXOpen.Logging href: ~/articles/logging/README.md items: diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 7d9b9111e..1b0376331 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -5,6 +5,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoDataman EXTENDS AXOpen.Core.AxoComponent IMPLEMENTS AXOpen.Components.Abstractions.IAxoCodeReader VAR PUBLIC + /// + /// Restores this instance. This method must be implemented in derived class. + /// {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentHeader()]} {#ix-set:AttributeName = "<#Read#>"} @@ -51,7 +54,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR /// - /// Restores this instance. + /// Restores this instance . /// METHOD PROTECTED OVERRIDE Restore: IAxoTask VAR @@ -98,7 +101,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD /// - /// Custom logic for manual control of the AxoDataman. + /// Custom logic for the manual control. /// METHOD PROTECTED OVERRIDE ManualControl ; @@ -384,11 +387,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 METHOD PROTECTED OVERRIDE Close SUPER.Close(); END_METHOD - + /// + /// Clears the result data. + /// METHOD PUBLIC ClearResultData : IAxoTaskState ClearResultData :=_clearResultDataTask.Invoke();; END_METHOD - + /// + /// Triggers the reading sequence and waits for results. + /// METHOD PUBLIC Read : IAxoTaskState Read := _readTask.Invoke(); END_METHOD diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index 5837903a3..28a1edf14 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -65,4 +65,4 @@ scripts: da: - apax do-it-all targets: - - "1500" + - plcsim diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index 6661c99e8..34e264c3e 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -1,5 +1,5 @@ USING AXOpen.Core; -//USING AXOpen.Cognex.Vision.v_6_0_0_0; +USING AXOpen.Cognex.Vision.v_6_0_0_0; NAMESPACE AxoCognexVisionDatamanExamples @@ -13,6 +13,7 @@ NAMESPACE AxoCognexVisionDatamanExamples ActivateManualControl : BOOL; PlcInputs : REF_TO PlcInputs; PlcOutputs : REF_TO PlcOutputs; + myString : STRING; END_VAR METHOD PROTECTED OVERRIDE Main @@ -22,6 +23,7 @@ NAMESPACE AxoCognexVisionDatamanExamples MyDataman2.ActivateManualControl(); END_IF; // Calling the main method `Run` with respective input and output variables. + // MyDataman1.Run( parent := THIS, refAcquisitionControl := REF(PlcOutputs^._10a1_Acquisition_Control_1), refAcquisitionStatus := REF(PlcInputs^._10a1_Acquisition_Status_1), @@ -31,7 +33,7 @@ NAMESPACE AxoCognexVisionDatamanExamples refSoftEventStatus := REF(PlcInputs^._10a1_Soft_Event_Control_1), refResultData := REF(PlcInputs^._10a1_Result_Data_128_bytes_1), refUserData := REF(PlcOutputs^._10a1_User_Data_128_bytes_1)); - + // MyDataman2.Run( parent := THIS, refAcquisitionControl := REF(PlcOutputs^.reader_st2_Acquisition_Control_1), refAcquisitionStatus := REF(PlcInputs^.reader_st2_Acquisition_Status_1), @@ -41,6 +43,24 @@ NAMESPACE AxoCognexVisionDatamanExamples refSoftEventStatus := REF(PlcInputs^.reader_st2_Results_Status_1), refResultData := REF(PlcInputs^.reader_st2_Result_Data_64_bytes_1), refUserData := REF(PlcOutputs^.reader_st2_User_Data_64_bytes_1)); + + END_METHOD + + METHOD DocuExample + // + IF MyDataman1.Read().IsDone() THEN + //Process the result data + myString := MyDataman1.Results.Data; + END_IF; + // + + // + IF MyDataman1.ClearResultData().IsDone() THEN + //Data inside MyDataman1.Results.Data is cleared + ; + END_IF; + // END_METHOD + END_CLASS END_NAMESPACE diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index d1138bc22..3474ad32c 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -3,10 +3,6 @@ version: '0.1.4-alpha.79' type: app registries: '@ix-ax': https://npm.pkg.github.com/ -targets: - - "1500" - - plcsim - - axunit-llvm devDependencies: "@ax/sdk": ^4.0.3 "@ax/sld": ^0.15.9 @@ -14,9 +10,8 @@ dependencies: "@ix-ax/axopen.data": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' "@ax/system-serde": ^2.0.2 - variables: - APAX_BUILD_ARGS: [ -d ] + APAX_BUILD_ARGS: [-d] scripts: ixc: - dotnet tool restore --no-cache @@ -29,11 +24,11 @@ scripts: - apax install - apax build # Here you will need to set the argumen -t to your plc OP and -i to platfrom you are dowloading to + # --default-server-interface is a must if you are using WebAPI - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface watch: - - dotnet watch --project - ..\\axosimple.app\\axosimple.hmi.csproj + - dotnet watch --project ..\\axosimple.app\\axosimple.hmi.csproj da: - apax download - apax watch @@ -71,3 +66,5 @@ scripts: - ..\\scripts\\StartPlcSimAdvCli.exe - apax install - apax rr +targets: + - plcsim From 9bdf5467ea149c8505395b04a11a658c8dd92afc Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 8 Aug 2023 10:25:25 +0200 Subject: [PATCH 31/32] optimalization of the signals updated on visu --- .../ctrl/src/AxoComponent_Status.st | 1 + .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 17 ++--------------- .../AxoComponent/AxoComponentView.razor | 19 +++++++++++-------- .../AxoComponent/AxoComponentView.razor.cs | 9 +++++++++ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/components.abstractions/ctrl/src/AxoComponent_Status.st b/src/components.abstractions/ctrl/src/AxoComponent_Status.st index 2819898b7..0cd8382b2 100644 --- a/src/components.abstractions/ctrl/src/AxoComponent_Status.st +++ b/src/components.abstractions/ctrl/src/AxoComponent_Status.st @@ -3,6 +3,7 @@ USING AXOpen.Core; NAMESPACE AXOpen.Components.Abstractions CLASS PUBLIC AxoComponent_Status VAR PUBLIC + {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "ActionDescription: |[[1]ActionDescription]|"} {#ix-attr:[WarningLevel(600)]} {#ix-attr:[ErrorLevel(700)]} diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 1b0376331..f7759b1da 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -33,9 +33,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentDetails("Status")]} - {#ix-set:AttributeName = "<#Update#>"} - _updateSignalStatesTask : AXOpen.Core.AxoTask; - {#ix-attr:[ComponentDetails("Status")]} {#ix-attr:[ReadOnly()]} Status : AxoDataman_Status; @@ -63,7 +60,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Action.Id := UINT#0; Status.Error.Id := UINT#0; - _updateSignalStatesTask.Restore(); _clearResultDataTask.Restore(); _readTask.Restore(); @@ -342,11 +338,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR _restoreTask.Initialize(THIS); - _updateSignalStatesTask.Initialize(THIS); _clearResultDataTask.Initialize(THIS); _readTask.Initialize(THIS); THIS.UpdateInputs(refAcquisitionStatus,refResultsStatus,refSoftEventStatus,refResultData); + THIS.UpdateSignalStates(); IF Config.ContinuousReading THEN THIS.ContinuousReading(REF(Status), REF(Results),refResultData); @@ -360,16 +356,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; //**************************************** - //*************UPDATE********************* - _taskDisabled := _taskDisabled OR _restoreTask.IsBusy(); - _updateSignalStatesTask.IsDisabled:= _taskDisabled; - IF _updateSignalStatesTask.Execute() THEN - THIS.UpdateSignalStates(); - END_IF; - //**************************************** - //*************CLEAR*DATA***************** - _taskDisabled := _taskDisabled OR _updateSignalStatesTask.IsBusy(); + _taskDisabled := _taskDisabled OR _restoreTask.IsBusy(); _clearResultDataTask.IsDisabled := _taskDisabled; _clearResultDataTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results)); //**************************************** @@ -424,7 +412,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.SignalStatus.ResultExtended := Results.Extended; Status.SignalStatus.ResultLength := Results.Length; - _updateSignalStatesTask.DoneWhen(TRUE); END_METHOD END_CLASS diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor index 1f65aa048..8c793db52 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor @@ -35,19 +35,22 @@ {
    - - @foreach (var detailsTab in DetailsTabs) - { - - + @foreach (var detailsTab in DetailsTabs) + { + + - - } - + + } + + }
    } diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs index 965f7fd7f..0a8c671b4 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs @@ -15,6 +15,15 @@ public partial class AxoComponentView : IDisposable [Parameter] public bool IsControllable { get; set; } + public override void AddToPolling(ITwinElement element, int pollingInterval = 250) + { + if (element is AxoComponent axoComponent) + { + axoComponent._isManuallyControllable.StartPolling(pollingInterval, this); + PolledElements.Add(axoComponent._isManuallyControllable); + } + } + private IEnumerable GetAllTabNames(ITwinObject twinObject) { return twinObject.GetKids().Where(p => p.GetAttribute() != null) From a320471f30ad56d0435de9a81176213ba4b70456 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 8 Aug 2023 10:53:44 +0200 Subject: [PATCH 32/32] update packages --- .../AXOpen.Abstractions/ix_ax_axopen_abstractions.csproj | 4 ++-- .../AXOpen.Base.Abstractions.csproj | 2 +- .../ix_ax_axopen_components_abstractions.csproj | 4 ++-- .../axopen_cognex_vision_blazor.csproj | 4 ++-- .../AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj | 6 +++--- src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj | 4 ++-- src/core/src/AXOpen.Core/ix_ax_axopen_core.csproj | 4 ++-- src/data/src/AXOpen.Data/ix_ax_axopen_data.csproj | 4 ++-- .../axopen_integrations_blazor.csproj | 2 +- .../src/AXOpen.Integrations/axopen_integrations.csproj | 6 +++--- src/probers/src/AXOpen.Probers/ix_ax_axopen_probers.csproj | 4 ++-- .../tests/AXOpen.Probers.Tests/axopen_probers_tests.csproj | 2 +- .../AXOpen.Security.Blazor/AXOpen.Security.Blazor.csproj | 2 +- src/templates.simple/axosimple.twin/axosimple.csproj | 6 +++--- src/utils/src/AXOpen.Utils/ix_ax_axopen_utils.csproj | 4 ++-- 15 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/abstractions/src/AXOpen.Abstractions/ix_ax_axopen_abstractions.csproj b/src/abstractions/src/AXOpen.Abstractions/ix_ax_axopen_abstractions.csproj index f5fce8045..8885dc6c0 100644 --- a/src/abstractions/src/AXOpen.Abstractions/ix_ax_axopen_abstractions.csproj +++ b/src/abstractions/src/AXOpen.Abstractions/ix_ax_axopen_abstractions.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive
    - - + + diff --git a/src/base/src/AXOpen.Base.Abstractions/AXOpen.Base.Abstractions.csproj b/src/base/src/AXOpen.Base.Abstractions/AXOpen.Base.Abstractions.csproj index 40eb37eb8..0d27a680f 100644 --- a/src/base/src/AXOpen.Base.Abstractions/AXOpen.Base.Abstractions.csproj +++ b/src/base/src/AXOpen.Base.Abstractions/AXOpen.Base.Abstractions.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj index f5ae4a8f1..0e53f2d24 100644 --- a/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj +++ b/src/components.abstractions/src/AXOpen.Components.Abstractions/ix_ax_axopen_components_abstractions.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj index 02479ed2e..7e660039f 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj @@ -19,8 +19,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj index 3605271fc..d45d802c3 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/ix_ax_axopen_cognex_vision.csproj @@ -10,9 +10,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj b/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj index d9b43b75b..8137e717a 100644 --- a/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj +++ b/src/core/src/AXOpen.Core.Blazor/axopen_core_blazor.csproj @@ -22,8 +22,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/core/src/AXOpen.Core/ix_ax_axopen_core.csproj b/src/core/src/AXOpen.Core/ix_ax_axopen_core.csproj index 362f1c43c..ca263307b 100644 --- a/src/core/src/AXOpen.Core/ix_ax_axopen_core.csproj +++ b/src/core/src/AXOpen.Core/ix_ax_axopen_core.csproj @@ -8,8 +8,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/data/src/AXOpen.Data/ix_ax_axopen_data.csproj b/src/data/src/AXOpen.Data/ix_ax_axopen_data.csproj index ed4c3da67..e4435c241 100644 --- a/src/data/src/AXOpen.Data/ix_ax_axopen_data.csproj +++ b/src/data/src/AXOpen.Data/ix_ax_axopen_data.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/integrations/src/AXOpen.Integrations.Blazor/axopen_integrations_blazor.csproj b/src/integrations/src/AXOpen.Integrations.Blazor/axopen_integrations_blazor.csproj index e4a9a5132..fe92626c6 100644 --- a/src/integrations/src/AXOpen.Integrations.Blazor/axopen_integrations_blazor.csproj +++ b/src/integrations/src/AXOpen.Integrations.Blazor/axopen_integrations_blazor.csproj @@ -38,7 +38,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj index dcb50db77..34d627b27 100644 --- a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj +++ b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj @@ -10,9 +10,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/src/probers/src/AXOpen.Probers/ix_ax_axopen_probers.csproj b/src/probers/src/AXOpen.Probers/ix_ax_axopen_probers.csproj index 30f766b1b..d61953ff7 100644 --- a/src/probers/src/AXOpen.Probers/ix_ax_axopen_probers.csproj +++ b/src/probers/src/AXOpen.Probers/ix_ax_axopen_probers.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/probers/tests/AXOpen.Probers.Tests/axopen_probers_tests.csproj b/src/probers/tests/AXOpen.Probers.Tests/axopen_probers_tests.csproj index 5a431d8e9..529805929 100644 --- a/src/probers/tests/AXOpen.Probers.Tests/axopen_probers_tests.csproj +++ b/src/probers/tests/AXOpen.Probers.Tests/axopen_probers_tests.csproj @@ -27,7 +27,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/security/src/AXOpen.Security.Blazor/AXOpen.Security.Blazor.csproj b/src/security/src/AXOpen.Security.Blazor/AXOpen.Security.Blazor.csproj index ca6099ea0..95234dd3c 100644 --- a/src/security/src/AXOpen.Security.Blazor/AXOpen.Security.Blazor.csproj +++ b/src/security/src/AXOpen.Security.Blazor/AXOpen.Security.Blazor.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/templates.simple/axosimple.twin/axosimple.csproj b/src/templates.simple/axosimple.twin/axosimple.csproj index f838068b6..44cebb31f 100644 --- a/src/templates.simple/axosimple.twin/axosimple.csproj +++ b/src/templates.simple/axosimple.twin/axosimple.csproj @@ -5,9 +5,9 @@ enable - - - + + + diff --git a/src/utils/src/AXOpen.Utils/ix_ax_axopen_utils.csproj b/src/utils/src/AXOpen.Utils/ix_ax_axopen_utils.csproj index 923042c40..f70980e60 100644 --- a/src/utils/src/AXOpen.Utils/ix_ax_axopen_utils.csproj +++ b/src/utils/src/AXOpen.Utils/ix_ax_axopen_utils.csproj @@ -12,8 +12,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + +

    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