Post by duvanmoreno24 on Modbus writing on value change
CODESYS Forge
talk
(Post)
Hi all, I want to know if someone has an idea of how I can write on value change in Modbus Codesys. I have a Wago PLC and I was used to work with E-cockpit which it was quite easy to do that without the necessity to trigger any value when there was a change in the variable ( I will put how easy is ). how you can see just changing the trigger in "On value Change" will do that channel writing automatically when It detects a change in those arrays. On the other hand, in Codesys if I enable the rising edge in Codesys It ask me to put a bool variable and if triggers is going to write that value. That is making me that I have to create a function or a logic to detect the change, the problem I have is that doing that is very tedious. I first approach I got it was to create a Function who returns a bool when the value change, but I tried to keep the old value but what is happening is that in Functions all the data is erased every cycle so I can not keep any Old value. so in the Main program the trigger is going to be TRUE all the time due, the old value is cero every cycle. The second approach I got it was using a function Block (POU_1) and it works but I dont want to instance that function for every Channel or value that I want to check if the value change, Basically if I have 200 values to write trhough modbus I have to create 200 instances of that function which I think it is not practicall at all. It should be a better way to implement this as e-Cockpit from Wago Does. However, I haven't been able to know how.
Last updated: 2024-03-26
Post by brouwyka on JSONByteArrayWriter string result incorrect order
CODESYS Forge
talk
(Post)
Hello everybody! We are currently working on implementing a call to an API that tracks data sent to it through a JSON body. Versions: CODESYS V3.5 SP19 Patch 7 using IIOT Libraries SL license, specifically JSON Utilities SL version 1.13.0.0. For simplicity, let's say we want to construct the following JSON body for our request (simplified to just 1 key-value pair in each of the array objects to keep things shorter, but we'd have multiple fields in each in reality): { "id": "machine_1", "readings": [ { "temp_mid": 153.8 }, { "temp_mid": 98.3 } ], "status": "RUNNING" } However, our "readings" data is added over time, not in creation, so calls to the builder would be somewhat out of order. In a simplified manner, our calls would look like this: jsonBuilder(pJsonData := JsonData, diRootObj => rootJsonIndex); // rootJsonIndex = 0. // Set "id" at root JSON object. wsValue := "machine_1"; jsonBuilder.SetKeyWithValue("id", wsValue, diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 0 & diIndex = 1, VALUE: diParentIndex = 1 & diIndex = 2. // ... Time passes, we get our first reading to add ... // The "readings" array does not exist yet, so we make it first at root JSON object before adding our first reading. readingsJsonArrayIndex := jsonBuilder.SetKeyWithArray("readings", diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 0 & diIndex = 3, VALUE: diParentIndex = 3 & diIndex = 4. // Then add the first reading, for which we first have to make an object. readingsJsonArrayObjectIndex := jsonBuilder.SetObject(diParentIndex := readingsJsonArrayIndex); // JSONData OBJECT: diParentIndex = 4 & diIndex = 5. // And then we add the field(s) in the object for the first reading. // NOTE the use of `readingsJsonArrayObjectIndex` so we set the field(s) in the first object in the array. rValue := 153.8; jsonBuilder.SetKeyWithValue("temp_mid", wsValue, diParentIndex := readingsJsonArrayObjectIndex); // JSONData KEY: diParentIndex = 5 & diIndex = 6, VALUE: diParentIndex = 6 & diIndex = 7. // ... Time passes, we want to add another root-JSON-level field ... // Set "status" at root JSON object. wsValue := "RUNNING"; jsonBuilder.SetKeyWithValue("status", wsValue, diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 0 & diIndex = 8, VALUE: diParentIndex = 8 & diIndex = 9. // ... Time passes, we want to add a second reading ... // "readings" array exists, so add the second reading, but first we have to make another object. // NOTE the re-use of the earlier stored `readingsJsonArrayIndex`, so we add the new object to that previously created array. readingsJsonArrayObjectIndex := jsonBuilder.SetObject(diParentIndex := readingsJsonArrayIndex); // JSONData OBJECT: diParentIndex = 4 & diIndex = 10. // And then we add the field(s) in the object for the first reading. // NOTE the use of `readingsJsonArrayObjectIndex` so we set the field(s) in the SECOND(, new) object in the array. rValue := 98.3; jsonBuilder.SetKeyWithValue("temp_mid", wsValue, diParentIndex := rootJsonIndex); // JSONData KEY: diParentIndex = 10 & diIndex = 11, VALUE: diParentIndex = 11 & diIndex = 12. // ... Finally, we want to send to the API, so we must convert the builder to data the client accepts as a body ... xTestWriteToJsonArray := TRUE; jsonArrayWriter( xExecute := xTestWriteToJsonArray, pwData := ADR(jsonDataString), udiSize := SIZEOF(jsonDataString), jsonData := JsonData^ ); IF jsonArrayWriter.xDone THEN // The writer was successful, the `jsonDataString` VAR should now contain a WString copy of the JSON object from the builder. xTestWriteToJsonArray := FALSE; END_IF We see that the JsonData STRUCT is correctly organised (in terms of the diParentIndex & diIndex set by it for each JsonElement) as we expect, as outlined in my comments in the simplified code above. However, as soon as we pass it to the jsonArrayWriter (which is a JSON.JSONByteArrayWriter), the resulting jsonDataString does not match our expectations, instead coming out like this: { "id": "machine_1", "readings": [ { "temp_mid": 153.8 } ] } { "temp_mid": 98.3 } "status": "RUNNING" The behaviour of the JSONByteArrayWriter thus seems to be the problem here. It does not seem to correctly process the children of JsonElements that are ARRAYs when additions to them are done broken up by additions to the lower level JSON OBJECT they are a part of. We have confirmed this by changing the order of the calls in our example to add both readings before adding the "status", in which case we get our expected outcome. However, in reality this is not possible for us - additions to any of the JSON's objects, arrays or array objects may happen at any time after other fields elsewhere in the JSON have been added. Does anyone know a way around this, a fix, or knows a solution we simply have not found? This same phenomenon was also noted on this forum by user @ryusoup at the end of 2023 (https://forge.codesys.com/forge/talk/Engineering/thread/c45929e2f1/#e27f) and user @mtho in early 2024 (https://forge.codesys.com/forge/talk/Engineering/thread/cd1bb450db/#1292) but both topics received no activity beyond both users' opening posts. Looking through the release notes of all the versions of the JSON Utilities SL library, I also did not see any remarks on resolutions of bugs in this vain. Thanks in advance for the assistance!
Last updated: 2026-06-10
Edgelogix-rpi-1000-cm4102032 SPI port connection to PiFace I/O Driver in CodeSys.
CODESYS Forge
talk
(Thread)
Edgelogix-rpi-1000-cm4102032 SPI port connection to PiFace I/O Driver in CodeSys.
Last updated: 2023-08-21
Post by kreisfilho on Same program to more than one PLC
CODESYS Forge
talk
(Post)
Hi, How can I assign a monitor (non touch) connected to a Raspberry pi (via HDMI) as visualization output?
Last updated: 2023-08-23
Post by mozed on Connection to device closed
CODESYS Forge
talk
(Post)
Hello I am using an OpusA3 with version 3.5 SP17 Patch 3 as part of a project. I had no real problem before I encountered a problem that blocked me. The detection of the OpusA3 from Codesys is done correctly. The gateway is well configured and if I ping the gateway or the OpusA3 I receive the response correctly. The problem is that when I try to connect, the Opus screen freezes and a few moments later Codesys displays an error message ("connection to device closed"). I tried to change PC, to update the runtime, to change OpusA3 but the problem remains the same. I'm a little lost knowing that before it worked without problem. I went back to a previous version of the project (where it worked correctly) but the message still appears. Do you have any clues to solve the problem? Sincerely,
Last updated: 2023-08-23
How to call the same program from library and get the vars updated.
CODESYS Forge
talk
(Thread)
How to call the same program from library and get the vars updated.
Last updated: 2023-08-23
Post by vformanek on How to access files correctly in Linux
CODESYS Forge
talk
(Post)
Hello, its still not quite clear to me how to deal with the PLCLogic directory in linux. I have the directory right here: I need to correctly access the files in this folder through CODESYSControl.cfg. Here is my CODESYSControl.cfg where on the first lines there are a few lines: [SysFile] FilePath.1=/etc/, 3S.dat PlcLogicPrefix=1 That means that if I am going to use relative paths its going to go to from the PLCLogic directory right ? For example here: Whitch paths should I use. I cant seem to successfully run any of these aproaches ...
Last updated: 2023-09-08
How to make Alarm table display timestamp with local time for alarms?
CODESYS Forge
talk
(Thread)
How to make Alarm table display timestamp with local time for alarms?
Last updated: 2020-03-31
how to run the machine using CNC editor in codesys
CODESYS Forge
talk
(Thread)
how to run the machine using CNC editor in codesys
Last updated: 2007-10-24
How does I make IO mapping possible to a new device.
CODESYS Forge
talk
(Thread)
How does I make IO mapping possible to a new device.
Last updated: 2018-11-15
Is it possible to replace a table row header for a text in a text list?
CODESYS Forge
talk
(Thread)
Is it possible to replace a table row header for a text in a text list?
Last updated: 2021-10-21
Mapping PLC world(code) to Hardware world(remote IO) with some OOP style
CODESYS Forge
talk
(Thread)
Mapping PLC world(code) to Hardware world(remote IO) with some OOP style
Last updated: 2017-01-19
2D array , data move from a column to another column
CODESYS Forge
talk
(Thread)
2D array , data move from a column to another column
Last updated: 2011-03-23
PLC (Lenze with CoDeSysy) as MODBUS TCP Slave to connect a 3th party touchscreen
CODESYS Forge
talk
(Thread)
PLC (Lenze with CoDeSysy) as MODBUS TCP Slave to connect a 3th party touchscreen
Last updated: 2017-01-02
RPI How to login for a copy of the SD image
CODESYS Forge
talk
(Thread)
RPI How to login for a copy of the SD image
Last updated: 2023-10-18
Find Function: Object reference not set to an instance of an object.
CODESYS Forge
talk
(Thread)
Find Function: Object reference not set to an instance of an object.
Last updated: 2023-10-30
How to convert a standard robot program into an excutive list when a robot runs?
CODESYS Forge
talk
(Thread)
How to convert a standard robot program into an excutive list when a robot runs?
Last updated: 2023-11-25
Post by mabac on Unable to load boot application on ARMv7 device restart
CODESYS Forge
talk
(Post)
You may just need to create a boot application: https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_creating_a_boot_application.html
Last updated: 2023-11-30
Post by jegerjon on Testing of Codesys program
CODESYS Forge
talk
(Post)
I have a simulation function that toggle xSimActive. I map all IO variables to "IO GVLs" when xSimActive=0. I map IO corresponding SimIO GVL to "IO GVLs" when xSimActive=1. Then I write code for the simulation program that runs when xSimActive=1. Typically increase flow corresponding to pump speed, simulate tankfilling corresponding to flow and so on. I made a FC that require a correct code to activate simulation to avoid unintended activation by service dept. When comissioned remove any possibility to activate simulation. Super when officetesting and supporting service dept. + cheap as it requires no additional equipment, and it is easier to support customer later on in the life cycle as you can test proposed changes without setting up a testlab.
Last updated: 2023-12-07
Post by jegerjon on Testing of Codesys program
CODESYS Forge
talk
(Post)
I have a simulation function that toggle xSimActive. I map all IO variables to "IO GVLs" when xSimActive=0. I map IO corresponding SimIO GVL to "IO GVLs" when xSimActive=1. Then I write code for the simulation program that runs when xSimActive=1. Typically increase flow corresponding to pump speed, simulate tankfilling corresponding to flow and so on. I made a FC that require a correct code to activate simulation to avoid unintended activation by service dept. When comissioned remove any possibility to activate simulation. Super when officetesting and supporting service dept. + cheap as it requires no additional equipment, and it is easier to support customer later on in the life cycle as you can test proposed changes without setting up a testlab.
Last updated: 2023-12-07
What the right way to update TCP/COM slave device holding registers
CODESYS Forge
talk
(Thread)
What the right way to update TCP/COM slave device holding registers
Last updated: 2024-07-01
Data Sources Manager causing exception due to float or double type in OPC server
CODESYS Forge
talk
(Thread)
Data Sources Manager causing exception due to float or double type in OPC server
Last updated: 2024-07-01
How to configure gateway for programming RPi 2B using Codesys
CODESYS Forge
talk
(Thread)
How to configure gateway for programming RPi 2B using Codesys
Last updated: 2024-07-10
Post by ron-rp on Errors with VisuUserManagement library
CODESYS Forge
talk
(Post)
I dont even need to clean, just compile again and the error disappears hopefullt someone knows what to do with it..
Last updated: 2024-07-14
C0244: No VAR_PERSISTENT list is part of the application to enter instance path for variable
CODESYS Forge
talk
(Thread)
C0244: No VAR_PERSISTENT list is part of the application to enter instance path for variable
Last updated: 2024-07-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.