Post by ewi04 on Recipe Manager - RecipeManCommands, load & write wrong values, Bug?
CODESYS Forge
talk
(Post)
It's good that you've found a workaround. But it's bad that you need one. The array length auf my struct is 16. My struct also contains other arrays of structs. It contains a total of 1716 variables. I have tested saving and loading extensively under version 4.3.0.0. It looks good. I couldnβt find any problems. Maybe it helps to reinstall the update (see previous post). Otherwise you could try my test project (first post). This should work with version 4.3.0.0.
Last updated: 2024-03-04
Post by fless on FB having single input but initialized with Array
CODESYS Forge
talk
(Post)
Why will it retain the sum value from the last call? This is how PLC work. Usually variables only get initialized after a download or a reset (i.e. power loss). RETAIN variables are saved in a special kind of RAM and keep their value after a power loss. To initialize variables on every call of your FB use the VAR TEMP block. VAR_TEMP sum : INT; END_VAR
Last updated: 2024-05-07
Post by corriibme on Setting array values with JSON Utilities SL
CODESYS Forge
talk
(Post)
It turns out that you can build JSON structures without ever calling the JSONBuilder function block directly. Instead, create a pointer to JSON.JSONData and invoke the necessary methods on its dereference. The parent object has a parent index of -1 (and an index of 0). EVERY other item (including keys, values, empty arrays and sub-objects) created by the setX methods needs the index to increase by 1. Then use the JSONByteArrayWriter FB to generate your JSON string
Last updated: 2024-05-23
Post by talhaali on Create an alarm list without use of Alarm config
CODESYS Forge
talk
(Post)
Hi, I am trying to access active alarms in code(As alarm count variable updates only when we go to to alarm table frame in visualization). I wrote following code but it is not working: VAR iCountActiveAlarms : INT; parritfActiveAlarms : POINTER TO ARRAY[0..0] OF IAlarm; itfAlarmManagerClientAll : IAlarmManagerClient; END_VAR AlarmManager.g_AlarmHandler.GetActiveAlarms( itfAlarmManagerClient :=itfAlarmManagerClientAll, iCountActiveAlarms => iCountActiveAlarms, parritfActiveAlarms => parritfActiveAlarms); The Value is always 0. Please help.
Last updated: 2024-06-06
Post by talhaali on Create an alarm list without use of Alarm config
CODESYS Forge
talk
(Post)
Hi, I am trying to access active alarms in code(As alarm count variable updates only when we go to to alarm table frame in visualization). I wrote following code but it is not working: VAR iCountActiveAlarms : INT; parritfActiveAlarms : POINTER TO ARRAY[0..0] OF IAlarm; itfAlarmManagerClientAll : IAlarmManagerClient; END_VAR AlarmManager.g_AlarmHandler.GetActiveAlarms( itfAlarmManagerClient :=itfAlarmManagerClientAll, iCountActiveAlarms => iCountActiveAlarms, parritfActiveAlarms => parritfActiveAlarms); The Value is always 0. Please help.
Last updated: 2024-06-06
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 struccc on Inheritence of struct,
CODESYS Forge
talk
(Post)
Strangely reminds me to my struggles... Want to do something "Elegant", reusable, universal, practical... In CODESYS??? π First of all, before you get too deep into this: If you could find a way, to make a "universal" log entry object, containing the variable length data itself, you wouldn't be able to store them in an array, or access them like an array, or pass them by value as a type. (please correct me, if I'm wrong, incorrect, or not precise). Because... Basically you can't declare a type with variable memory footprint. This is a very deeply embedded characteristic of CODESYS, and all IEC 61131-3 systems, and it has many reasons behind. And yes, it is a very common trap / mistake, to forget about. So, with a log entry - I guess - it's pretty much the purpose: store data and metadata together, and then handle it in a uniform way. There are ways to handle this, really depends on what is the purpose. For example: 1. Entries with fixed length (Maybe it is not as evil as it looks for the first time. Depends on the situation, but definitely the fastest and easiest code) You can have your base object, with an internal, fixed length string or byte array variable. I would go with a string, and call it _Data.; And then you can make properties, like As_Bool, As_Int, As_Real... In the 'set' accessors, you can do like: pReal := ADR(_Data); // POINTER TO REAL As_Real := pReal^; In the 'get' accessors, evidently: pReal := ADR(_Data); // POINTER TO REAL pReal^ := AS_Real; Or, can use ANY type, if you are not obsessed with variable / property like access: 2. Fixed length, but nicer First, some disadvantage to any values: - You can only assign values with write access. No literals, constants, etc... - Can only be used as input variable of function or function_block - Therefore, stg you could reach: LogEntry.Initialize (stVariable|rVariable|iVariable|xVariable); Just a quick example (it's funny to play with ANY): Be careful it was not tested. I'm sure can be done better, please feel free to comment FUNCTION_BLOCK FB_LogEntry VAR_INPUT MsgClass : UDINT; // Like DEBUG, WARN, ERR... MsgCode : UDINT; // Like Errors.ERR_FAILED MsgTS : DT; // The timestamp END_VAR VAR _Data : STRING(80); // Our data container... _Descr : __SYSTEM.AnyType; // A standard descriptor for our data, containing TYPE_CLASS, address and size END_VAR METHOD SET_Value : BOOL VAR_INPUT anyValue : ANY; END_VAR VAR I : DINT; diSize : DINT; pStr : POINTER TO STRING; END_VAR // Check what did we receive in anyValue. diSize := anyValue.diSize; // We use constant __SYSTEM.TYPE_CLASS to identify the received data type CASE anyValue.TypeClass OF // Maybe we don't want to store references, pointers... and who knows what else... __SYSTEM.TYPE_CLASS.TYPE_REFERENCE, __SYSTEM.TYPE_CLASS.TYPE_POINTER : SET_Value := FALSE; // For the planned types we will be just fine. TYPE_CLASS.TYPE_BOOL, TYPE_CLASS.TYPE_INT, TYPE_CLASS.TYPE_REAL : SET_Value := TRUE; // Optionally string can be handled separately, maybe we have received STRING(255), but practically it is shorter than 80 bytes... TYPE_CLASS.TYPE_STRING : pStr := anyValue.pValue; diSize := MIN(anyValue.diSize, LEN(pStr^) + 1); // Get the actual size, and rewrite the received structure member diSize := MIN(SIZEOF(_Data), diSize); // Can chop down the received string to our length... SET_Value := TRUE; // Maybe want to play a little bit more here, to narrow down or convert datatypes, etc... // Or just reject any other datatype ELSE SET_Value := FALSE; RETURN; END_CASE // Fail, if the received value is still larger than our container... IF diSize > SIZEOF(_Data) THEN SET_Value := FALSE; END_IF // Here we should be ok, just set up the _DataType structure, and copy store the data IF SET_Value THEN THIS^._Descr.TypeClass := anyValue.TypeClass; // The typeclass is already filtered THIS^._Descr.diSize := diSize; // Set the (adjusted) size THIS^._Descr.pValue := ADR(_Data); // This will not change, just to be sure {IF defined (pou:SysMem.SysMemCpy)} SysMem.SysMemCpy(_DataType.pValue, anyValue.pValue, TO_UDINT(anyValue.diSize)); {ELSE} // An ugly replacement MemCpy FOR I:=0 TO diSize - 1 DO _Descr.pValue[I] := anyValue.pValue[i]; END_FOR {END_IF} // Otherwise, in case of failure maybe better set an empty value (overwrite the former data descriptor) ELSE THIS^._Descr.TypeClass := TYPE_CLASS.TYPE_NONE; THIS^._Descr.pValue := ADR(_Data); THIS^._Descr.diSize := 0; END_IF METHOD GET_Value : BOOL VAR_INPUT anyValue : ANY; END_VAR VAR I : DINT; END_VAR // We just have to serve the data, using the __System.AnyType structure received // Roughly we can say: IF anyValue.TypeClass = _Descr.TypeClass AND anyValue.pValue <> 0 // This should not be possible, already taken care of by Codesys (?) THEN {IF defined (pou:SysMem.SysMemCpy)} SysMem.SysMemCpy(anyValue.pValue, _DataType.pValue, TO_UDINT(MIN(anyValue.diSize, _Descr.diSize))); {ELSE} // An ugly replacement MemCpy FOR I:=0 TO MIN(anyValue.diSize -1, _Descr.diSize - 1) DO anyValue.pValue[I] := _Descr.pValue[I]; END_FOR {END_IF} // Just to make sure, that our string is terminated... IF anyValue.TypeClass = TYPE_CLASS.TYPE_STRING THEN anyValue.pValue[anyValue.diSize -1] := 0; END_IF GET_Value := TRUE; RETURN; END_IF // ... But can play more CASE anyValue.TypeClass OF TYPE_CLASS.TYPE_WSTRING : ; // Could do conversion TYPE_CLASS.TYPE_XSTRING : ; // Wow, I have to figure this out TYPE_CLASS.TYPE_PARAMS : ; // BTW, what is this, how to use? TYPE_CLASS.TYPE_ANYNUM : ; // ... END_CASE Be careful it was not tested. I'm sure can be done better, please feel free to comment 3. If you really want to do entries with variable size In a standard environment, it would be similar to the previous, except you dont have the container variable _Data, just use a pointer, practically _Descr.pValue At Initialize (SET_Value), you have to allocate the memory, would be easy with SysMem.SysMemAlloc - nowadays with SysMem.SysMemAllocData -, and you make sure to release it after use with SysMem.SysMemFreeData... SysMemAlloc was already hidden. The problem with this, that sooner or later your application will totally fragment the dynamic memory, and fail... So should look for some form of dynMaybe MemUtils.MemoryManager (I am not sure what is the status and the future of it). 4. You will end up by a LogEntry Factory ... 5. You could still have a look at this IEC Snippets BTW, Standard Codesys Logger is not a bad choice either. If you are really interested, I share some more code / library.
Last updated: 2025-03-09
Post by wbj0t on What the right way to update TCP/COM slave device holding registers
CODESYS Forge
talk
(Post)
Hi all :) I have an plc. This plc has option to be as slave device. There are TCP -> Serial Slave Device and COM -> Serial Slave Device. There are 4096 ModBus holding registers with mark "internal modify" for the both devices above. So, COM Slave has 4096 registers and TCP Slave has 4096 registers. And, finally, I have an ARRAY[0..4095] OF WORD. This array glued with COM Slave and TCP slave. Yes, I need plc's opportunity to be communication both TCP and COM ways for the same registers. For example, the next task structure: * TASK_0: 1. pou_READ_Registers 2. pou_0 3. pou_1 4. ... 5. pou_N 6. pou_WRITE_Registers At the first pou I read registers for the other pous, after job we have sort of state of the plc. At the last pou (6) we write modified registers. It is a good scenario: some one wrote registers for the job, after job we save these (modified) registers. But, what if registers wrote between 1 and 6 pou by operator, for example, at the 3 pou -> the last pou 'pou_WRITE' will rewrite this request from operator. What the right way to work with this logic? Thanks you.
Last updated: 2024-07-01
Post by e13740e on Parameterized Property syntax for array element processing
CODESYS Forge
talk
(Post)
Hello. I'm trying to create a Parameterized Property(CDS V3.5 SP21) to avoid copy-pasting code for processing array elements. I can't seem to get any result. Perhaps I am making a mistake with the syntax. None of the declaration options below are accepted by the compiler. If you know and use them (Parameterized Properties) in your work, please let me know. Thank you in advance. Option 1: PROPERTY <property_name> : <data_type> VAR_INPUT <index_name> : <index_type>; // One or more index parameters are declared here END_VAR</index_type></index_name></data_type></property_name> GET Code that uses <index_name> to return a value END_GET</index_name> SET Code that uses <index_name> and the implicit variable <property_name> to write a value END_SET</property_name></index_name> END_PROPERTY Option 2: PROPERTY <property_name> (<index_name> : <index_type>) : <data_type></data_type></index_type></index_name></property_name> GET Code that uses <index_name> to return a value END_GET</index_name> SET Code that uses <index_name> and the implicit variable <property_name> to write a value END_SET</property_name></index_name> END_PROPERTY
Last updated: 2025-10-09
Post by e13740e on Parameterized Property syntax for array element processing
CODESYS Forge
talk
(Post)
Hello. I'm trying to create a Parameterized Property(CDS V3.5 SP21) to avoid copy-pasting code for processing array elements. I can't seem to get any result. Perhaps I am making a mistake with the syntax. None of the declaration options below are accepted by the compiler. If you know and use them (Parameterized Properties) in your work, please let me know. Thank you in advance. Option 1: PROPERTY <property_name> : <data_type> VAR_INPUT // One or more index parameters are declared here <index_name> : <index_type>; END_VAR</index_type></index_name></data_type></property_name> // Accessor for reading GET // Code that uses <Index_Name> to return a value END_GET // Accessor for writing SET // Code that uses <Index_Name> and // the implicit variable <Property_Name> to write a value END_SET END_PROPERTY Option 2: PROPERTY <property_name> (<index_name> : <index_type>) : <data_type></data_type></index_type></index_name></property_name> // Accessor for reading GET // Code that uses <Index_Name> to return a value END_GET // Accessor for writing SET // Code that uses <Index_Name> and // the implicit variable <Property_Name> to write a value END_SET END_PROPERTY
Last updated: 2025-10-09
Post by ofey on Modbus TCP communication
CODESYS Forge
talk
(Post)
Hi! I tried setting up the PLC I'm working with (Beijer GN-9373) to connect to a modbus master running on a laptop. I have an ethernet connection (via USB-C to ethernet) between the laptop and the controller. I have tried following tutorial on how to set this up. I have added an ethernet device with the IP-address of the PLC. Further I added a ModbusTCP_Slave_Device with default settings. I get the error "Failed to open TCP Port: 1" when I try to go online with the PLC. Earlier I tested the exact same set up with the soft PLC from codesys. I can then read/write values correctly with the Modbus master i have running on the laptop. Hope anybody can help me with this, thanks in advance!
Last updated: 2023-10-06
Post by riccardo on Management of a PLC network from a remote station
CODESYS Forge
talk
(Post)
Goodmorning, I would need to set a control station that can manage a PLC network. In short I need to access to all visu programmed in any PLC of the network (LAN). I was thinking to use a PLC with buttons that call, by mean an IP address, the visu of any PLC. I don't know if it is possible but I saw that there is a RemoteVisuTarget that run CODESYS Control Win V3. Can someone suggest me how to create a remote main control station from a normal PC? Thanks, Riccardo
Last updated: 2023-11-27
Post by mikek10 on HTTP Client TCP Init Error
CODESYS Forge
talk
(Post)
Hi, I tried posting in the discussion for the HTTP Client example but perhaps that is not monitored? I have been using http client successfully for approximately 12 months, however in recent weeks I have begun to get TCP_INIT_ERROR when attempting to communicate. The only resolution seems to be power cycling and then the connection begins to work again for a time. I am not aware of any changes to code or libraries between working ok and now. Cold reset does not resolve, only power cycle. It seems the error from NBS.TCP_Client is 6002 which I think is invalid_addr However the address is the same when working and not working?
Last updated: 2024-07-04
Post by xiaolo on Raspberry Pi 5
CODESYS Forge
talk
(Post)
Does Ver. 4.12 support Raspberry Pi 5? I have three issues. The first issue is that Codesys cannot detect the RPI 5 when I want to download the runtime. When assigning the IP Address manually then I can download the runtime. The second issue is that I cannot connect to the RPI to download a program. Sometimes the window pops up and it ask for the user credentials, but it is still not connecting. The third issue is that I cannot connect to an ESP32 configured as a Modbus Slave with a Raspberry Pi 4B. I can connect to the ESP32 via a Radzio! Modbus Master Simulator. I am also missing the function Write Holding Registers in the setup of the slave. Are this known issues and when it will be solved?
Last updated: 2024-07-12
Post by jinlee on Reading Camera Feed in Codesys v3.5 webvisu web element browser
CODESYS Forge
talk
(Post)
Hi guys, I have been trying to use web browser element in the visualisation to connect with my IP camera. From the past few weeks, I have not been successful of doing it. I thought it would be very easy to just connect to the ip address, but apparantly it is not. I am using WAGO PLC PFC200 and my PC as a webvisu. or else can you guys please advice me on which kind of camera should I use as a CCTV system in my project instead of IP Camera. Ideally, I want multiple web browser elements to browse my IP Cameras in one frame. Kind regards, Jin.
Last updated: 2024-09-16
Post by jinlee on Reading Camera Feed in Codesys v3.5 webvisu web element browser
CODESYS Forge
talk
(Post)
Hi guys, I have been trying to use web browser element in the visualisation to connect with my IP camera. From the past few weeks, I have not been successful of doing it. I thought it would be very easy to just connect to the ip address, but apparantly it is not. I am using WAGO PLC PFC200 and my PC as a webvisu. or else can you guys please advice me on which kind of camera should I use as a CCTV system in my project instead of IP Camera. Ideally, I want multiple web browser elements to browse my IP Cameras in one frame. Kind regards, Jin.
Last updated: 2024-09-16
Post by jinlee on Reading Camera Feed in Codesys v3.5 webvisu web element browser
CODESYS Forge
talk
(Post)
Hi guys, I have been trying to use web browser element in the visualisation to connect with my IP camera. From the past few weeks, I have not been successful of doing it. I thought it would be very easy to just connect to the ip address, but apparantly it is not. I am using WAGO PLC PFC200 and my PC as a webvisu. or else can you guys please advice me on which kind of camera should I use as a CCTV system in my project instead of IP Camera. Ideally, I want multiple web browser elements to browse my IP Cameras in one frame. Kind regards, Jin.
Last updated: 2024-09-16
Post by jeroenaero on CodeSys Raspberry pi I2C driver not found
CODESYS Forge
talk
(Post)
Hello, We have a problem with CodeSys on a raspbery pi with an ADS1015 analog to I2C module. It can't find the I2C device on the i2c bus, it says No I2C Driver Found. When we use the RPI terminal we can find the I2C device and read it out. The i2c-1 bus is also accessible from codesys. The device address of the Analog to I2C module is 0x48. Can someone have a look what the problem is? i submitted the screenshots in the attachments. i also include the device description and library.
Last updated: 2024-11-07
Post by cihangur on OpC UA server on Raspberry Pi 64 SL runtime
CODESYS Forge
talk
(Post)
After my tests, I noticed two issues. 1- WinCC disconnects the connection after receiving the GetEndPointResponse message from CoDeSys. (I found it with UAExpert and Wireshark.) 2- It establishes a connection despite waiting for a while on the network with DNS. As a result of this information: I solved the problem by adding the line "193.193.193.150 t9pac" to the C:\Windows\System32\Drivers\etc\hosts file and making Windows accept messages coming from the IP number 193.193.193.150 as coming from t9pac. (t9pac is the name of my PLC running CoDeSys.) If there is a setting that will allow CoDeSys OPC UA to respond to GetEndPointRequest with its IP address, this problem will not occur.
Last updated: 2024-12-12
Post by struccc on Problem Reading Registers via Modbus from non Codesys device
CODESYS Forge
talk
(Post)
Hi, Might be a good idea first to try out the connection and the device with some handy software, like Modbus Poll. There you can see better, what's really going on... - Is it really connected? - What error code does it return? - Can it read from the register address? - Maybe try Input registers and Holding Registers - can make a difference - Sometimes register addresses are messed up: shifted +-1 (mixing of 2 standards) - Sometimes register addresses start with offset 30000, 40000 ... - Are you using the right protocol? - Is it RTU or TCP? Maybe ASCII? - Can even have a look at the data packets, etc... All this is easier to figure out first with some modbus utility... and then to set it up in CODESYS should not be an issue. P.
Last updated: 2025-03-09
Post by alexgooi on Licensing info not available.
CODESYS Forge
talk
(Post)
Dear Forum I have the following config: Codesys_IDE 3.5.20 Codesys_Virtual_Control 4.13 Codesys_License_Server 4.13 I know these are not the newest versions, but in my mind these should work. I have the same problem here. I have the license server installed on the host, and in the docker container(Codesys virtual control) I'm able to ping the license server. In the /conf/codesyscontrol/CODESYSControl_User.cfg I have added the following config: [CmpCodeMeter] EnableNetLicenses=1 LicenseServer.1="ip address of the host" I have tried it via the wbm web-page. I can create new license containers over there, but still no luck. I also have tried to run the docker container with the -s "server_IP" command. I have searched for some tutorial's but I couldn't find it. If anyone has some clue or can give me a push in the right direction it would be very very welcome!
Last updated: 2025-09-29
Post by dhumphries on Codesys device configuration
CODESYS Forge
talk
(Post)
First make sure the programming laptop and HMI are both on the same subnet. For example if the IP address of the HMI is 192.168.1.125 with a subnet mask 255.255.255.0 set your laptop IP to 192.168.1.120 with a subnet mask of 255.255.255.0. Make sure the cables are fully connected (the ethernet port on my programming laptop will click once but the cable is not fully seated.) Make sure the HMI is powered on, try pinging the device from a command prompt, if you can't ping the HMI there is a network issue that has to be resolved first.
Last updated: 2023-12-30
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 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 valec on Connect local Asem HMI runtime to local Codesys Control Win V3 x64
CODESYS Forge
talk
(Post)
I have a project made on a PL700 PLC with Codesys and an Asem Premium HMI panel. I don't have access to the physical PLC right now, so I'm trying to use Codesys Control Win V3 x64. I created the application and loaded "Codesys Control Win V3 x64" without errors, then I activate "Start PLC" from the tray. Asem cannot connect. I tried to use "localhost" or the local IP address and it doesn't work (it's the "CoDeSys Soft PLC Communication Driver"). I need to connect my local Asem runtime to a virtual Codesys application on my PC. How can I do it?
Last updated: 2024-03-26
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.