Does CODESYS use its own native driver for I2c?
CODESYS Forge
talk
(Thread)
Does CODESYS use its own native driver for I2c?
Last updated: 2024-02-13
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
Post by rmaas on Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
CODESYS Forge
talk
(Post)
Wow, this is next level for me, very impressive! glad you found a solution, thanks for sharing!
Last updated: 2024-02-13
Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
CODESYS Forge
talk
(Thread)
Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
Last updated: 2024-02-13
wiki Discussion
sl0802
wiki
(Discussion)
Forum for wiki comments
Last updated: 2024-02-13
blog Discussion
sl0802
blog
(Discussion)
Forum for blog comments
Last updated: 2024-02-13
(no subject)
sl0802
wiki
(Thread)
Last updated: 2024-02-13
Post by rmaas on Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
CODESYS Forge
talk
(Post)
The reference used is the ethercat slave name. For example in this screenshot the reference would be: EL1809_1
Last updated: 2024-02-13
Post by totorovic on Project loses 'Download time' information
CODESYS Forge
talk
(Post)
Hello, It happens that the offline project (the IDE one) loses the Download information. Because of this the code has to be download again. Is it possible to force this info somewhere? Is it possible to ignore it? How can I solve this ? Thank you
Last updated: 2024-02-13
How to address visualization change with button press...
CODESYS Forge
talk
(Thread)
How to address visualization change with button press...
Last updated: 2024-02-13
Ethercat Dynamic Configuration : Clear all slaves
CODESYS Forge
talk
(Thread)
Ethercat Dynamic Configuration : Clear all slaves
Last updated: 2024-02-13
Home
sl0802
wiki
(WikiPage)
Project Members: sl0802 (admin)
Last updated: 2024-02-13
Post by nmcc on How to address visualization change with button press...
CODESYS Forge
talk
(Post)
Hello all, I am extremely new to Codesys and to programming with these languages in general. I have an HMI panel with 8 physical buttons to the right side of it. I am trying to have these set to change the visualization to a specific screen which I have designed 8 of. I currently have "use CurrentVisu" enabled in the visualization manager. I also have input blocks with all of the buttons being directed to output blocks which I want to have as the switcher for the visualization. Picture is attached for what I have currently. This could be the wrong approach to this issue. Any help is much appreciated.
Last updated: 2024-02-13
Post by sl0802 on Ethercat Dynamic Configuration : Clear all slaves
CODESYS Forge
talk
(Post)
Hi, Can you please share some information how did you configure ethercat slaves dynamically with Ethercat stack library. It would be Great help!! Thank you, Regards.
Last updated: 2024-02-13
Post by arundara on OPC UA Server Stops after 5 consecutive disconnections of ethernet port
CODESYS Forge
talk
(Post)
Hello Every one, During testing of OPC UA communication between UA Expert software and the CODESYS SoftPLC on a Linux environment, an observation was made. When the Ethernet cable was disconnected and reconnected with 2-minute intervals, on the 5th attempt, the OPC UA connection failed to establish in UA Expert software. At this juncture, restarting the CODESYS SoftPLC enabled the reestablishment of OPC UA communication. The same result was obtained when testing on a Raspberry Pi SoftPLC. What is the reason behind this phenomenon? and whether there are settings to stop this behavior? Please help. Thanks & Regards.
Last updated: 2024-02-13
Axis declare
CODESYS Forge
talk
(Thread)
Axis declare
Last updated: 2024-02-13
Home (version 1) discussion
ralfbischoff
wiki
(Thread)
Home (version 1) discussion
Last updated: 2024-02-13
Post by nmcc on How to address visualization change with button press...
CODESYS Forge
talk
(Post)
Hello all, I am extremely new to Codesys and to programming with these languages in general. I have an HMI panel with 8 physical buttons to the right side of it. I am trying to have these set to change the visualization to a specific screen which I have designed 8 of. I currently have "use CurrentVisu" enabled in the visualization manager. I also have input blocks with all of the buttons being directed to output blocks which I want to have as the switcher for the visualization. Picture is attached for what I have currently. This could be the wrong approach to this issue. Any help is much appreciated.
Last updated: 2024-02-13
Post by arundara on Variable Sync Issue In Soft Plc Redundancy
CODESYS Forge
talk
(Post)
i understood that we have to use sync variable function. when i used this i was able to achieve on the requirements of our project.
Last updated: 2024-02-13
Post by reinier-geers on Axis declare
CODESYS Forge
talk
(Post)
In motioncontrol every block start with Axis. How can i make a variable to make my own FB ? Somthink like : _Axe : pointer to Axis_Ref_MC := Axis_1 ;
Last updated: 2024-02-13
OPC UA Server Stops after 5 consecutive disconnections of ethernet port
CODESYS Forge
talk
(Thread)
OPC UA Server Stops after 5 consecutive disconnections of ethernet port
Last updated: 2024-02-13
Post by dkugler on How to address visualization change with button press...
CODESYS Forge
talk
(Post)
you can get the help by yourself in the helpme site: https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_operator_move.html
Last updated: 2024-02-13
json utilities not reading or writing files
CODESYS Forge
talk
(Thread)
json utilities not reading or writing files
Last updated: 2024-02-13
Home (version 1) discussion
pierre123
wiki
(Thread)
Home (version 1) discussion
Last updated: 2024-02-14
blog Discussion
karol-abktech
blog
(Discussion)
Forum for blog comments
Last updated: 2024-02-14