Search talk: 0

 
<< < 1 .. 6 7 8 9 10 .. 18 > >> (Page 8 of 18)

Post by francois68 on CLEARING STORED ALARMS FROM ALARM MANAGER CODESYS Forge talk (Post)
Solution: VAR itfAlarmConfig: AlarmManager.IAlarmConfiguration; itfAlarmConfig7: AlarmManager.IAlarmConfiguration7; SCRIPT itfAlarmConfig := AlarmGlobals.g_AlarmHandler.GetAlarmConfiguration(0); IF __QUERYINTERFACE(itfAlarmConfig, itfAlarmConfig7) THEN itfAlarmConfig7.ClearHistory(FALSE); END_IF Works perfectly for me.
Last updated: 2025-02-21

Post by pernockham on Inheritence of struct, CODESYS Forge talk (Post)
Easier that I thought, by ALIAS TYPE log_item_val_type : ( BOOL_ := 0, INT_, REAL_, STRING_ ); END_TYPE TYPE LOG_DATA_BASE STRUCT val_type : log_item_val_type; (* value, name etc *) ENDSTRUCT ENDTYPE TYPE LOG_DATA_BOOL : LOG_DATA_BASE := (val_type := log_item_val_type.BOOL_); END_TYPE TYPE LOG_DATA_INT : LOG_DATA_BASE := (val_type := log_item_val_type.INT_); END_TYPE TYPE LOG_DATA_REAL : LOG_DATA_BASE := (val_type := log_item_val_type.REAL_); END_TYPE TYPE LOG_DATA_STRING : LOG_DATA_BASE := (val_type := log_item_val_type.STRING_); END_TYPE
Last updated: 2025-03-05

Post by davidbo on Why does SysTimeRtcSet not set the clock on a Pi 4 CODESYS Forge talk (Post)
temp:=DT_TO_DWORD(newTD); result:=SysTimeRtcSet(ulTimestamp:=DWORD_TO_WORD(temp)); the result=0 which mean ok but the clock is not set
Last updated: 2025-06-27

Post by gseidel on Arcs intersection CODESYS Forge talk (Post)
Hi blitz, the G1 sentences N50, N70, and N110, which have length 0, lead to a stop of interpolation between the arcs. If you remove these lines, SMC_SmoothPath works (I tried it). Bst regards, Georg
Last updated: 2025-09-24

Post by eschwellinger on Possibility to deactivate CmpBlkDrvUdp CODESYS Forge talk (Post)
you could give this a try - just an idea, I did not try it because have no device in my hands: [CmpBlkDrvUdp] MaxInterfaces=1 itf.0.ipadress=192.168.10.1
Last updated: 2023-12-12

Post by reinier-geers on Time zone CODESYS Forge talk (Post)
I use a controller with Linux. I try to change timezone. but no result. The command of codesys i dont understand ?? And Linux Commands dont work. It stays at +0 . I want Amsterdam
Last updated: 2023-12-29

Post by victor on Trend-Trace / Time x-axis CODESYS Forge talk (Post)
Good morning, I am new to codesys, I am currently manipulating the Trace and Trend elements and I would like to know if it was possible to configure a variable or a trigger to reset the "X" axis to 0. have a good day.
Last updated: 2024-01-26

Post by john-robinson on Limiting Memory Access of an Array to Within its Bounds CODESYS Forge talk (Post)
Thanks Tim! This was exactly the functionality we were looking for. We are already using implicit checks to check for divide by 0 errors, we will add implicit checking for array bounds.
Last updated: 2024-03-06

Post by fless on FB having single input but initialized with Array CODESYS Forge talk (Post)
with every call of the FB500 it keeps adding the INTs of the array to the sum variable. set sum to 0 before you start the loop.
Last updated: 2024-05-06

Post by albertocamina on Login problem with FileTransfer on Raspberry Pi 5 CODESYS Forge talk (Post)
Thanks @eschwellinger! So my settings look like this on CODESYSControl_User.cfg: [CmpWebServerHandlerV3] AllowFileTransferServices=1 CallVisuServicesDirectly=0 Sadly, is still asking for user and password as soon webvisu is loaded... Any clue? Many thanks!
Last updated: 2024-06-03

Post by ahmed-abohelal on SysComRead Timeout Parameter CODESYS Forge talk (Post)
Hello I was facing the same problem i have to increase the timeout since the unit looks like to be in us SysComread(hCom:=hCom,pbyBuffer := ADR(readBuffer[0]),ulSize:=128,ulTimeout:=3000000,pResult:= ADR(readRes));
Last updated: 2025-10-22

Post by bertram on Installation IOT Libraries kann nicht installiert werden CODESYS Forge talk (Post)
Ok, unter Administratives Ereignis gibt es viele (15)Einträge mit nahezu identischer Uhrzeit, sagen alles das selbe.. EreignisID=0, was Bedeutet das nun ?
Last updated: 2025-11-26

Post by timvh on Modbus TCP Server connection is ESTABLISHED but all holding registers are value 0? CODESYS Forge talk (Post)
Are you sure you need to read holding registers? Have you tried reading input registers?
Last updated: 2026-01-07

Post by gilad on CODESYS SoftMotion Generic DSP402 on WAGO PFC200 + Festo CMMT-AS: MC_Power stays Busy, Controlword remains 0 CODESYS Forge talk (Post)
Thank you very much, What FESTO provides should work even if I use another PLC (WAGO) that is not from FESTO?
Last updated: 2026-06-30

Post by gseidel on CODESYS SoftMotion Generic DSP402 on WAGO PFC200 + Festo CMMT-AS: MC_Power stays Busy, Controlword remains 0 CODESYS Forge talk (Post)
Hi gilad, I cannot tell for sure. But I think it should work on any PLC that is capable of doing motion control. Best regards, Georg
Last updated: 2026-07-01

Post by charly29160 on CmpCharDevice blocks gpiochip access on Raspberry Pi 5 since update from SP18 to SP21 CODESYS Forge talk (Post)
wird nicht mit kopiert - sorry: PermittedPath.0=/dev/i2c PermittedPath.1=/dev/spidev PermittedPath.2=/sys/class/gpio/ PermittedPath.3=/dev/gpiochip
Last updated: 2026-07-20

Post by charly29160 on CmpCharDevice blocks gpiochip access on Raspberry Pi 5 since update from SP18 to SP21 CODESYS Forge talk (Post)
Problem gefunden und erledigt => in CODESYSControl_User.cfg ergänzt: [CmpCharDevice] PermittedPath.0=/dev/i2c PermittedPath.1=/dev/spidev PermittedPath.2=/sys/class/gpio/ PermittedPath.3=/dev/gpiochip Dann funktioniert es wieder Gruß Karl Schuler
Last updated: 2026-07-20

Post by fleaplc on Modbus TCP Server connection is ESTABLISHED but all holding registers are value 0? CODESYS Forge talk (Post)
Did you check the communication with a sniffer ? (ex. Wireshark) to check if the holding get to zero by a wrong writing (client initialization?) o something else?
Last updated: 2026-01-27

Post by akneer on HMI über Webbrowser CODESYS Forge talk (Post)
Beispiel: IF bShutdownPC THEN bShutdownPC := FALSE; // LINUX SysProcess_Implementation.SysProcessExecuteCommand( pszComand:='shutdown -h 0', pResult := ADR(udiError)); // WINDOWS SysProcess_Implementation.SysProcessExecuteCommand( pszComand:='shutdown.exe -s -t 05', pResult := ADR(udiError)); END_IF
Last updated: 2026-03-04

Post by timvh on USB Game Controller with Raspberry Pi CODESYS Forge talk (Post)
I'm not sure it will work, but you could try it with the CmpCharDevice library. You could create a function block that looks something like this: As input for the filename, you have to use your Linux device, e.g.: '/dev/input/event0' '/dev/input/by-path/platform-button@23-event' Off course you must also pass the pointer to the memory where the data can be written to and the size (count in number of bytes) of the buffer. FUNCTION_BLOCK FB_CharDevice VAR_INPUT szFilename: STRING; pbyBuffer : POINTER TO BYTE; udCount : UDINT; END_VAR VAR_OUTPUT iState : INT := 0; nrBytesRead : DINT; END_VAR VAR xInit : BOOL := TRUE; dFlags: DINT := CmpCharDevice.ACCESS_MODE.O_RDONLY + DINT#4000; // see details for flags: http://linux.die.net/man/2/open, + DINT#4000 is for non-blocking hDevice: CmpCharDevice.CmpCharDevice_Implementation.RTS_IEC_HANDLE := -1; Result : CmpCharDevice.CmpCharDevice_Implementation.RTS_IEC_RESULT; END_VAR IF xInit THEN hDevice := CmpCharDevice.CDOpen(szFilename, dFlags ,Result); // if it would not succeed, the result is -1 (Invalid handle) IF hDevice <> 16#FFFFFFFF AND Result = 0 THEN iState := 5; END_IF xInit := FALSE; END_IF IF iState = 5 THEN nrBytesRead := CmpCharDevice.CDRead(hDevice, pbyBuffer, udCount, Result); ELSE nrBytesRead := 0; END_IF Make sure you close the connection properly, maybe by overwriting the default FB_Exit method of the FB: // Clean up device IF hDevice <> 16#FFFFFFFF THEN __TRY CmpCharDevice.CDClose(hDevice,Result); __CATCH ; __ENDTRY iState := 0; END_IF
Last updated: 2026-05-01

Post by denizerm on Deploy Control SL cant find Podman CODESYS Forge talk (Post)
Hello, CODESYS seems to have problems finding the container engine. In the "Deploy Control SL" window, after connecting via ssh, it simply says: [INFORMATION] Connected successfully! [INFORMATION] Successfully connected to target (192.168.4.199) [WARNING] Error detecting container architecture running podman info yields normal results. My podman info output is as follows: home/Admin$ podman info host: arch: amd64 buildahVersion: 1.35.3 cgroupControllers: - cpu - memory - pids cgroupManager: systemd cgroupVersion: v2 conmon: package: Unknown path: /usr/bin/conmon version: 'conmon version 2.1.10, commit: affab49967eb62f75d2a47398344ab053326289f' cpuUtilization: idlePercent: 99.36 systemPercent: 0.3 userPercent: 0.34 cpus: 4 databaseBackend: sqlite distribution: codename: scarthgap distribution: redagv version: 1.0.0 eventLogger: journald freeLocks: 2040 hostname: secure-automation-os idMappings: gidmap: - container_id: 0 host_id: 1000 size: 1 - container_id: 1 host_id: 100000 size: 65536 uidmap: - container_id: 0 host_id: 1100 size: 1 - container_id: 1 host_id: 100000 size: 65536 kernel: 6.6.65-intel-pk-standard linkmode: dynamic logDriver: journald memFree: 6115598336 memTotal: 8086278144 networkBackend: cni networkBackendInfo: backend: cni dns: {} ociRuntime: name: crun package: Unknown path: /usr/bin/crun version: |- crun version 1.14.3.0.0.0.8-89d44-dirty commit: 89d44467e3b410b73f2065756a12789be45b855b rundir: /run/user/1100/crun spec: 1.0.0 +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +YAJL os: linux pasta: executable: /usr/bin/pasta package: Unknown version: "" remoteSocket: exists: true path: /run/podman-shared/podman.sock security: apparmorEnabled: false capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT rootless: true seccompEnabled: true seccompProfilePath: "" selinuxEnabled: false serviceIsRemote: true slirp4netns: executable: /usr/bin/slirp4netns package: Unknown version: |- slirp4netns version 1.2.0-beta.0+dev commit: unknown libslirp: 4.7.0 SLIRP_CONFIG_VERSION_MAX: 4 libseccomp: 2.5.5 swapFree: 0 swapTotal: 0 uptime: 1h 36m 10.00s (Approximately 0.04 days) variant: "" plugins: authorization: null log: - k8s-file - none - passthrough - journald network: - bridge - macvlan - ipvlan volume: - local registries: localhost:5000: Blocked: false Insecure: true Location: localhost:5000 MirrorByDigestOnly: false Mirrors: null Prefix: localhost:5000 PullFromMirror: "" search: - localhost store: configFile: /home/serviceuser/.config/containers/storage.conf containerStore: number: 2 paused: 0 running: 2 stopped: 0 graphDriverName: overlay graphOptions: {} graphRoot: /data/containerfiles graphRootAllocated: 119952025600 graphRootUsed: 13801246720 graphStatus: Backing Filesystem: extfs Native Overlay Diff: "true" Supports d_type: "true" Supports shifting: "false" Supports volatile: "true" Using metacopy: "false" imageCopyTmpDir: /var/tmp imageStore: number: 4 runRoot: /run/user/1100/containers transientStore: false volumePath: /data/containerfiles/volumes version: APIVersion: 5.0.2-dev Built: 1711987427 BuiltTime: Mon Apr 1 16:03:47 2024 GitCommit: bb81e85a430fa95d23a15b77c717fd68bf06ebf2 GoVersion: go1.22.12 Os: linux
Last updated: 2025-10-22

Post by timo on String nach erlaubten/unerlaubten Zeichen durchsuchen CODESYS Forge talk (Post)
Hallo, Ich bastele gerade an einer möglichst einfachen Möglichkeit mit der ich prüfen kann ob ein String Sonderzeichen enthält. Mein Ansatz ist ein ST FB mit einer Case Schrittkette. Ich vergleiche jedes Zeichen des Strings mit allen Zeichen eines vorher definierten Strings erlaubter Zeichen, der A-Z, a-z und 0-9 enthält und ggf angepasst werden kann, wenn ich weitere Zeichen erlaube. Leider wird meine j Zählervariable nicht richtig ausgeführt. Hat da jemand eine Idee? Oder gibt es eine einfachere Lösung/einen fertigen FB den ich mir anschauen kann? FUNCTION_BLOCK Sonderzeichen_Check VAR_INPUT inputString : STRING; // Zu prüfender String startCheck : BOOL; // Startsignal END_VAR VAR_OUTPUT ok : BOOL; // TRUE, wenn keine ungültigen Zeichen END_VAR VAR i : INT := 1; // Input-String Zähler j : INT := 1; // erlaubte Zeichen Zähler allowedChars: STRING := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; // Erlaubte Zeichen currentChar : STRING[1]; // Aktuelles Zeichen step : INT := 0; // Schritt END_VAR CASE step OF 0: // Warten auf Start IF startCheck THEN step := 10; END_IF 10: // Initialisierungen i := 1; j := 1; ok := TRUE; // Standard: ok step := 20; 20: // Durchgehen des Eingangs-Strings IF i <= LEN(inputString) THEN currentChar := MID(inputString, i, 1); // Aktuelles Zeichen step := 30; ELSE step := 70; // Alle Zeichen ok END_IF 30: // Durchgehen der erlaubten Zeichen IF j <= LEN(allowedChars) THEN step := 40; // Zu Schritt 40 ELSE step := 60; // Ungültiges Zeichen END_IF 40: // Vergleich IF currentChar = MID(allowedChars, j, 1) THEN i := i + 1; // Nächstes Zeichen im Input step := 20; ELSE j := j + 1; // Nächstes erlaubtes Zeichen step := 30; END_IF 60: // Ungültiges Zeichen ok := FALSE; // Setze auf FALSE step := 0; 70: // Alle Zeichen ok step := 0; END_CASE
Last updated: 2025-01-20

Post by john-robinson on Limiting Memory Access of an Array to Within its Bounds CODESYS Forge talk (Post)
Recently we had an issue regarding some simple code to calculate a rolling average. The code indexes from zero to 199 to properly store the current input into a circular buffer which then allows us to calculate a rolling average: VAR input_5s : REAL; outs_arr : ARRAY[0..199] OF REAL; i : USINT := 0; END_VAR ___ //this code runs every five seconds, calculating a rolling average outs_arr[i] := input_5s; i := i + 1; output := OSCAT_BASIC.ARRAY_AVG(ADR(outs_arr), SIZEOF(outs_arr)); IF i >= SIZEOF(outs_arr) THEN i := 0; END_IF There is a simple bug in this code where the index will be set to 0 when it has surpassed the length of the array in bytes (800 in this case) rather than larger than the number of reals in the array (200). The solution here is simple, replacing i >= SIZEOF(outs_arr) with i >= SIZEOF(outs_arr)/SIZEOF(outs_arr[0]). In this example when the index increased to 201 and the line outs_arr[201] := input_5s was called, codesys arbitrarily wrote to the address in memory that is where outs_arr[201] would be if the array was that long. I would like to find a way to wrap the codesys array inside of a wrapper class that checks if an input is within the bounds of an array before writing to that value. I know how I would implement that for a specific array, I could create a method or class that takes an input of an array of variable length, ie. ARRAY[*] OF REAL, but I don't know how to make this for any data type. I am wondering if anyone has ever done anything similar to this, or has any better suggestions to ensure that none of the programmers on this application accidentally create code that can arbitrarily write to other locations in memory.
Last updated: 2024-03-05

Post by hammer on Cartesian XY Chart — 2-D array binding: "Element to use" enumerates the wrong dimension CODESYS Forge talk (Post)
Title: Cartesian XY Chart — 2-D array binding: "Element to use" enumerates the wrong dimension; documented example (Dialog: XY Chart Configuration, "Two-dimensional array of base type REAL") appears transposed Product / version: CODESYS Development System V3.5 SP21 Patch 40 (3.5.21.40). Cartesian XY Chart visualization element (System_VisuElemXYChart / VisuElemXYChart). Summary: When a curve's Data X/Data Y is bound to a two-dimensional array, the element treats the last array dimension as the per-point record (the one selected by "Element to use") and iterates the first dimension as the sequence of curve points. The online documentation's worked example has the dimensions in the opposite order, so following it produces a non-functional curve and a nonsensical "Element to use" list. Steps to reproduce (fails — matches the documented layout): 1. Declare aData : ARRAY[0..1, 0..4095] OF LREAL; (2 data sets × 4096 points, i.e. first dimension = set, second = point). 2. In XY Chart Configuration, bind a curve's Data X (and Y) Variable to this array. 3. Observe the "Element to use" combobox. Actual result: The "Element to use" combobox lists 4096 entries (the indices of the second dimension) instead of 2 (the data sets in the first dimension). Selecting a row does not produce the expected curve; at most a single/degenerate point is plotted. Steps to reproduce (works — transposed): 1. Declare aData : ARRAY[0..4095, 0..1] OF LREAL; (points first, set second). 2. Bind Data X/Y to this array; "Element to use" now correctly lists [0] and [1]. 3. Populate aData[point, set] and the curve plots as expected. Expected result: Either the documented example should select the data set from the first dimension (as its [1]/[2] "Element to use" implies), or the documentation should state that the last dimension is the record dimension (stride) and the first dimension is the point sequence — consistent with how the element actually behaves. Analysis: The behavior is self-consistent if the element always walks a single array by a fixed byte stride, reading one element per point — the same mechanism as the documented "one-dimensional array of a DUT" case, where it strides by SIZEOF(DUT) and "Element to use" picks the member offset. For a 2-D array the record is the last dimension: to plot column/set c it starts at [0, c] and strides by the last-dimension length to reach [1, c], [2, c], … (row-major layout makes this a contiguous column walk). Under that rule, ARRAY[0..N, 0..1] is correct (record length 2 → "Element to use" [0]/[1]), and the documented ARRAY[1..2, 1..50] with "Element to use" [1]/[2] is transposed. Documentation reference: Dialog: XY Chart Configuration → Data X / Data Y → "Example: Two-dimensional array of the base type REAL" (ARRAY[1..2, 1..50], Element to use [1]/[2], "100 array values are displayed"). This example does not plot as described in 3.5.21.40; transposing to ARRAY[1..50, 1..2] does. Request: Please confirm whether this is (a) a documentation error (example dimensions reversed) or (b) an element defect (combobox enumerates the wrong dimension). Either way, a corrected example plus an explicit statement of which dimension is the point sequence vs. the record/stride dimension would prevent others from hitting this. Two separate 1-D arrays for Data X and Data Y work correctly and are unaffected.
Last updated: 2026-08-14

Post by mondinmr on Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia CODESYS Forge talk (Post)
I have found a very interesting solution using: IoConfigTaskMap IoConfigConnectorMap IoConfigChannelMap The first is the list of IO tasks. The second is the connector for each IO module in the IOMap. The third is the individual input or output on the IOMap. One of the properties of the connector is another pointer to a connector, which corresponds with the connector of the EtherCAT slave. Through this information, it is possible to understand to which EtherCAT slave an IO connectormap corresponds. I am attaching an FB that allows for the construction of an IO map and finding the pointer to the actual IOs in the IOMap based on the bitoffset. FUNCTION_BLOCK IOExplorer VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR inputChannels: COL.LinkedList; outputChannels: COL.LinkedList; ulintFactory: COL.UlintElementFactory; END_VAR METHOD inputAtBitOffsetOfConnector : POINTER TO BYTE VAR_INPUT conn: POINTER TO IoConfigConnectorMap; bitOffset: UDINT; END_VAR VAR it: COL.LinkedListIterator; itf: COL.IElement; elem: COL.iUlintElement; channelInfo: POINTER TO ADVChannelInfo; bitOffsetR: UDINT; END_VAR inputChannels.ElementIterator(it); WHILE it.HasNext() DO it.Next(itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} channelInfo := TO___UXINT(elem.UlintValue); {warning restire C0033} IF channelInfo^.connectorField = conn THEN IF bitOffsetR = bitOffset THEN inputAtBitOffsetOfConnector := channelInfo^.addr; RETURN; END_IF bitOffsetR := bitOffsetR + channelInfo^.size; ELSE bitOffsetR := 0; END_IF END_WHILE inputAtBitOffsetOfConnector := 0; END_METHOD METHOD outputAtBitOffsetOfConnector : POINTER TO BYTE VAR_INPUT conn: POINTER TO IoConfigConnectorMap; bitOffset: UDINT; END_VAR VAR it: COL.LinkedListIterator; itf: COL.IElement; elem: COL.iUlintElement; channelInfo: POINTER TO ADVChannelInfo; bitOffsetR: UDINT; END_VAR outputChannels.ElementIterator(it); WHILE it.HasNext() DO it.Next(itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} channelInfo := TO___UXINT(elem.UlintValue); {warning restire C0033} IF channelInfo^.connectorField = conn THEN IF bitOffsetR = bitOffset THEN outputAtBitOffsetOfConnector := channelInfo^.addr; RETURN; END_IF bitOffsetR := bitOffsetR + channelInfo^.size; ELSE bitOffsetR := 0; END_IF END_WHILE outputAtBitOffsetOfConnector := 0; END_METHOD METHOD scanIO VAR_INPUT END_VAR VAR numTasks: DINT := IoConfig_Globals.nIoConfigTaskMapCount; tType: WORD; ioTask: POINTER TO IoConfigTaskMap; numCon: WORD; connector: POINTER TO IoConfigConnectorMap; numCh: DWORD; channelInfo: POINTER TO ADVChannelInfo; iTsk: DINT; iCon: WORD; iCh: DWORD; i: DINT; _tmpConnList: COL.IList; elem: COL.IUlintElement; itf: COL.IElement; tmpCh: POINTER TO ADVChannelInfo; lastE: DINT; e: COL.COLLECTION_ERROR; e1: Error; END_VAR VAR_INST lF: COL.ListFactory; END_VAR IF outputChannels.CountElements() > 0 OR inputChannels.CountElements() > 0 THEN RETURN; END_IF _tmpConnList := lF.CreateDynamicList(16, 16); //Iterate through all IO tasks FOR iTsk := 0 TO numTasks - 1 DO ioTask := ADR(IoConfig_Globals.pIoConfigTaskMap[iTsk]); //Store the type of the task (Input or Output) tType := ioTask^.wType; numCon := ioTask^.wNumOfConnectorMap; //Iterate through all connectors of the task FOR iCon := 0 TO numCon - 1 DO connector := ADR(ioTask^.pConnectorMapList[iCon]); numCh := connector^.dwNumOfChannels; //Iterate through all channels of the connector FOR iCh := 0 TO numCh - 1 DO //Create a new channel info object and fill it with the address, connector and size of the channel //Connectors is address of field connector in this case like EtherCAT slave //Address is the address of the IOMap //Size is the size of channel data in bits in IOMap channelInfo := __NEW(ADVChannelInfo); channelInfo^.addr := connector^.pChannelMapList[iCh].pbyIecAddress; channelInfo^.connectorField := connector^.pConnector; channelInfo^.size := connector^.pChannelMapList[iCh].wSize; //We put the channel info a temporary ordered list //Order is based on the address of IOMap lastE := TO_DINT(_tmpConnList.CountElements()) - 1; FOR i := 0 TO lastE DO _tmpConnList.GetElementAt(udiPosition := TO_UDINT(i), itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} tmpCh := TO___UXINT(elem.UlintValue); {warning restire C0033} //If the address of the channel is smaller than the address of the channel in the list IF tmpCh^.addr > channelInfo^.addr THEN //Insert the channel in the list at the current position _tmpConnList.InsertElementAt(TO_UDINT(i), ulintFactory.Create(TO_ULINT(channelInfo))); //Clear the channel info pointer channelInfo := 0; //Exit the loop i := lastE + 1; END_IF END_FOR //If the channel info is not 0, it means that the channel was not inserted in the list IF channelInfo <> 0 THEN //Add the channel to the end of the list elem := ulintFactory.Create(TO_ULINT(channelInfo)); _tmpConnList.AddElement(elem); END_IF END_FOR //Iterate temporary list and add the channels to the input or output list lastE := TO_DINT(_tmpConnList.CountElements()) - 1; FOR i := 0 TO lastE DO _tmpConnList.GetElementAt(udiPosition := TO_UDINT(i), itfElement => itf); __QUERYINTERFACE(itf, elem); {warning disable C0033} tmpCh := TO___UXINT(elem.UlintValue); {warning restire C0033} //If type is input, add the channel to the input list IF tType = TaskMapTypes.TMT_INPUTS THEN e := inputChannels.AddElement(ulintFactory.Create(TO_ULINT(tmpCh))); //If type is output, add the channel to the output list ELSIF tType = TaskMapTypes.TMT_OUTPUTS THEN e := outputChannels.AddElement(ulintFactory.Create(TO_ULINT(tmpCh))); ELSE __DELETE(tmpCh); END_IF END_FOR //Clear the temporary list _tmpConnList.RemoveAllElements(); END_FOR END_FOR END_METHOD
Last updated: 2024-02-13

<< < 1 .. 6 7 8 9 10 .. 18 > >> (Page 8 of 18)

Showing results of 445

Sort by relevance or date