Post by alimans on Hex string
CODESYS Forge
talk
(Post)
Hi kdkwhite, for Word you still can use suggested code by using a union structure and crack down your Word to two byte as bellow: TYPE CrackWordToByte : UNION InWord : WORD; OutBytes : ARRAY [0..1] OF BYTE; END_UNION END_TYPE then define your variable as this type: udInput : CrackWordToByte; now assign your Word variable input to InWord and send OutBytes[x] to the mentioned method: udInput.InWord := WordVariableInput; Input := udInput.OutBytes[x]; Regarding your question about the code: actually 48 is ascii code of "0" and while 65 is the ascii code of "A" so in above code 55 + 10 would be 65.
Last updated: 2023-09-20
Post by paulorb on STRUCT AT %MW1000
CODESYS Forge
talk
(Post)
Hi I am trying to use STRUCT to parse commands from Modbus/TCP, Modbus client will fill the bytes related to a specific command (type, parameters), then PLC (Codesys) will access the command parameters. A STRUCT will simplify a lot the process of parsing the data, so I don't need to parse byte per byte, address will be mapped to a struct and I can use it for parsing the data. From what I understood, the compiler does not allow me to specify the location of the struct for a %MW register. VAR_COMMAND AT %MW1002: structGenericModbusCommand; This will throw: Bad declaration, use '%ML' for 'structGenericModbusCommand' variable But If I change it to %ML, when you go online you see that it is actually allocating the struct in another memory address. When we go online, on GVL we can see: VAR_COMMAND. structGenericModbusCommand %ML1002 commandType COMMANDTYPE %MB8016 ... %MB8020 I am not specifying a pointer or a reference it is a struct type, why is it mapping to a %MW location (random one). How can I control where it is mapping to? I need a consistent way to map STRUCT to specific modbus address. Is it possible? Thanks, Paulo Note I am using a Codesys OEM: Schneider Machine Expert Logic Builder (M241)
Last updated: 2024-08-13
Post by drml on Array to String
CODESYS Forge
talk
(Post)
If a size is not specified, CODESYS allocates 80 characters by default for a string. After 7 seconds, does your Json_string contain all of your 20000 key/values? Or is the result truncated to 80 characters?
Last updated: 2024-07-19
Post by mmpl on Array to String
CODESYS Forge
talk
(Post)
Hi Thank you for you reply. Yes I can concatenat longer string. I am using string_Util_Intern libraray for concat. The issue is abot plc performance. It takes 7 second. I am looking to improve time.
Last updated: 2024-07-23
Post by installwhat on How to access to variable value through symbolic string name
CODESYS Forge
talk
(Post)
https://help.codesys.com/api-content/2/codesys/3.5.12.0/en/_cds_operator_string_to/ Something like this?
Last updated: 2024-06-13
Post by installwhat on How to access to variable value through symbolic string name
CODESYS Forge
talk
(Post)
https://help.codesys.com/api-content/2/codesys/3.5.12.0/en/_cds_operator_string_to/ Something like this?
Last updated: 2024-06-13
Post by vladimirsmall on Send data to USB
CODESYS Forge
talk
(Post)
Hello/ Need send some file ( for example Array of string) to USB. Which library need used for this. Thank you
Last updated: 2024-07-20
Post by remcoborghuis on C0032 Error to type Pointer to IoConfigParameter
CODESYS Forge
talk
(Post)
Hi All, I'm using codesys on a raspberry PI. I use V3.5 SP18 Patch 2 development system and codesys for raspberry pi 4.8.0.0. Sometimes when I build the project I get error messages C0007: Expression expected instead of ',' and C0032: Cannot convert type 'Unknow type: '!!!'ERROR'!!!" to type 'POINTER TO IoConfigParameter'. I can't click on the message to bring me to the fault. After I do a "Clean all" the build finishes successful. Anyone who can help me with this problem? Thanks! Remco Borghuis
Last updated: 2024-03-25
Post by dkugler on I want to convert a WORD to a hex string like 15.432 to '3C48'
CODESYS Forge
talk
(Post)
you try to convert a WORD with BYTE_TO_HEX directly? Using https://de.helpme-codesys.com/ lead to the SM3_shared lib. There is a function: https://content.helpme-codesys.com/en/libs/SM3_Shared/Current/SM3_Shared/StringFormat/Word_To_HexString.html
Last updated: 2024-04-19
Post by tk096 on Pointer to Softmotion axis
CODESYS Forge
talk
(Post)
Hi, you can take a look at https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_pragma_attribute_global_init_slot.html Maybe it helps.
Last updated: 2023-11-23
Post by tvm on Cannot pass array of constant size to a function as a reference
CODESYS Forge
talk
(Post)
It will be a reference, because it's a VAR_IN_OUT. it's a little weird debugging the array online. It just shows as a POINTER TO INT, and you can't actually see the array from the function side. But you can still work with it as a normal array, not a pointer.
Last updated: 2024-01-09
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
Zugriff auf BYTE in einem WORD / INT in einem DINT etc...
CODESYS Forge
talk
(Thread)
Zugriff auf BYTE in einem WORD / INT in einem DINT etc...
Last updated: 2023-01-19
addressin an array of byte containing bits of type bool
CODESYS Forge
talk
(Thread)
addressin an array of byte containing bits of type bool
Last updated: 2018-11-14
How I should define a huge size byte array in CoDeSys V3?
CODESYS Forge
talk
(Thread)
How I should define a huge size byte array in CoDeSys V3?
Last updated: 2013-05-09
How I should define a huge size byte array in CoDeSys V3?
CODESYS Forge
talk
(Thread)
How I should define a huge size byte array in CoDeSys V3?
Last updated: 2013-08-30
Post by bertcom on Converting each character to a string into ASCII
CODESYS Forge
talk
(Post)
@TimvH, Thank you, i think this way i can seperate the complete string to characters. Next part of the topic is converting the characters to an ASCII code. Is there an standerd function in Codesys for this? I alredy searched a few hours for it on the internet. no succes.
Last updated: 2024-11-11
Post by pazderai on CanOpen write issue
CODESYS Forge
talk
(Post)
Anyway, any idea how to get command byte 0x22 for sdo write if I use codesys cia405 canopen library?
Last updated: 2024-07-16
Post by abrarsk on SysCom Library Usage
CODESYS Forge
talk
(Post)
Update: I was able to successfully use the SysCom.lib. I had to install SysTypes2Interface library as well and wrote following code. Declaration hCom : RTS_IEC_HANDLE; pResult : POINTER TO RTS_IEC_RESULT; Implementation hCom := SysComOpen(ComSettings.sPort, ADR(pResult));
Last updated: 2024-08-10
Post by dkugler on Converting hex bytes to float
CODESYS Forge
talk
(Post)
have a look at UNIONs. With a union you are able to write single bytes to the same adress area which belongs to a float variable at the same time. I like to do a lot of convertions belonging to interfaces and fieldbus in this way, f.eg. word / byte swapping etc.
Last updated: 2024-08-06
Post by andreag0 on How to access to variable value through symbolic string name
CODESYS Forge
talk
(Post)
Good to know. I am looking for some soluction to avoid PLC Handler and OPC-UA. Thank you.
Last updated: 2024-06-14
Post by amy123 on JSON Utilities ENUM to STRING
CODESYS Forge
talk
(Post)
Hello, Is it possible to get the string returned from the ENUM JSONType? I read that with regular enumerations you can add '{attribute 'to_string'}' and access it. However, this is from the compiled library, so I can not add that attribute. When I try to use TO_STRING(JSONType) it returns the integer as a string. Ex. jsonType :=TO_STRING(pJSONData^._aJSONData[i].eType); gives '8' instead of NONE Thanks!
Last updated: 2024-12-09
Post by vstrom on Recipe definition, how to have the Name string in current language?
CODESYS Forge
talk
(Post)
I'd like to know if it is possible to have the "Name" field, in the recipe definition, language dependent. Something like to have the possibility to put there a string ID that will be add to the GlobalTextList. In this way it can be translated and when showed in a Visualization screen its value depend on the current language. Thanks.
Last updated: 2024-10-04
Post by abjha1998 on Codesys v3.5 Sint to byte
CODESYS Forge
talk
(Post)
Hi everyone, I have been doing a project where I have to send CAN messages from WAGO plc pf200 in BYtes. The signed integer needs to be unpacked into two bytes. so far I have tried Union but that has not worked with me
Last updated: 2024-04-22
Post by i-campbell on FILE_OPERATION_DENIED
CODESYS Forge
talk
(Post)
in your project, to access /var/opt/codesys/PlcLogic/my.file, use the string 'my.file' or '$$PlcLogic$$/my.file'
Last updated: 2023-10-17
To search for an exact phrase, put it in quotes. Example: "getting started docs"
To exclude a word or phrase, put a dash in front of it. Example: docs -help
To search on specific fields, use these field names instead of a general text search. You can group with AND
or OR
.