Post by rohan on Child Application Alarm
CODESYS Forge
talk
(Post)
Hi All, I'm trying to develop a multi-application project that allows me to switch between applications. I currently have a parent application and several child applications, as this is the only way for them to share CAN/Ethernet communication. I've noticed that I am only able to create an Alarm Configuration for the parent application. But the children application do not seem to be displaying alarms on the Alarm Table in the visualisation for when an alarm is raised. Does anyone know of a fix, solution or a way around this? I am utilising Codesys v3.5 SP16 Patch 5 64Bit
Last updated: 2024-06-21
Post by gediminas on Datasource OPC UA client system failure
CODESYS Forge
talk
(Post)
I am using CODESYS v3.5 SP20 Patch 3 / Control for BeagleboneBlack SL v4.13 and after some time the OPC UA Server crashes. However, Runtime still works without any issues. The events leading up to the OPC server crash are the most suspicious: 1) Mutex deadlock detected - owner thread died, and 2) Runtime received SIGABRT. And it seems very similar with this topic except used versions - issues should be fixed with previous SP's. I can't seem to find any information about these events. Need some pointers in the right direction on how I can fix this problem.
Last updated: 2024-10-25
Post by wbj0t on mobus tcp slave device. read/write holdings with 2 variables.
CODESYS Forge
talk
(Post)
Hi there. I have an issue to read and set time for the controller. In the issue many registers described as writable by 6/16 functions, and, in this time, also(!) readable! For example: I have time registers: min, hour, day, mon, year. By specifications it is possible check time (so I need always update these varibles in loop) and set time by writing these same registers, BUT how to set, if they will immediatle updated by current time after writing? So, I need to separate one address at two variables. I have seen option mark: Overlay of the process image by the holding and input register. I understand this so: When I READ by function 3, I will get variable that connected with the same INPUT address and when I WRITE by 6/16 this will change second variable that connected with HOLDING address. BUT, this mark doesnt work, when I write 6/16 and try to get by function 3, I will get written value instead INPUT variable. So, what to do?
Last updated: 2024-03-20
Post by anonymous on Hi, I try to send and receive data using a UDP connection via SysSocket 3.5.17.0. While sending data works fine, I have problems with the receiving part. I am able to capture the received data of client side in wireshark But unable to capture it on the codesys
CODESYS Forge
talk
(Post)
Hi, I try to send and receive data using a UDP connection via SysSocket 3.5.17.0. While sending data works fine, I have problems with the receiving part.I am able to capture the data of client side in wireshark but i am unable to capture it in the codesys. Heres the below part of code of client side. PROGRAM POU_udpclient_program VAR istep : INT := 1;//step variable for state machine xStart: BOOL;// Flag to start the UDP protocol iecSocketId: syssocket_interfaces.RTS_IEC_HANDLE;//socket handle for receiving iecCreateResult: syssocket_interfaces.RTS_IEC_RESULT; ipAddr: syssocket.SOCKADDRESS;//Socket address structure for receiving sIpAddress : STRING := '192.168.0.2'; wPort: WORD:= 12346; iecConnectResult : syssocket_interfaces.RTS_IEC_RESULT;//connect paramters sDataRec : STRING[255];//Buffer for received data xiRecBytes : __XINT;//number of bytes received iecRecResult : syssocket_interfaces.RTS_IEC_RESULT;//receive data parameters iecCloseResult : syssocket_interfaces.RTS_IEC_RESULT; END_VAR syssocket.SysSockInetAddr(sIpAddress,ADR(ipAddr.sin_addr)); ipAddr.sin_family := syssocket.SOCKET_AF_INET; ipAddr.sin_port := syssocket.SysSockHtons(wPort); CASE istep OF 1: //create socket IF xStart THEN iecSocketId:= syssocket.SysSockCreate(syssocket.SOCKET_AF_INET,syssocket.SOCKET_DGRAM,syssocket.SOCKET_IPPROTO_IP,ADR(iecCreateResult)); IF iecSocketId = syssocket_interfaces.RTS_INVALID_HANDLE THEN xStart := FALSE; istep := 1; ELSE istep := 2; END_IF END_IF 2: //connect to socket server using setoption iecConnectResult := syssocket.SysSockSetOption(iecSocketId,syssocket.SOCKET_SOL,syssocket.SOCKET_SO_REUSEADDR,ADR(ipAddr),SIZEOF(ipAddr)); istep := 3; 3: //receive data xiRecBytes := syssocket.SysSockRecvFrom(iecSocketId,ADR(sDataRec),SIZEOF(sDataRec),0,ADR(ipAddr),SIZEOF(ipAddr),ADR(iecRecResult)); istep := 4; 4: //close socket iecCloseResult:= syssocket.SysSockClose(iecSocketId); xStart := FALSE; istep := 1; END_CASE
Last updated: 2024-06-03
Post by sawicpx on CANbus Remapping PDOs During Runtime
CODESYS Forge
talk
(Post)
Hello, I am working on an application where I need to remap PDOs to a different CANopen object during runtime depending on what value is at a specific register. I have gotten to the point where I put the device into Preoperational State using the CIA405.NMT function. I then reconfigure the PDO 180x and 1a0x obejcts usings SDOs to point to a new canopen object on the device however when I go to restart the Device from PREOP to OP using the CIA405.NMT function the device is reset back to the original configuration as per the initial setup. I am wondering is there any way to change the PDOs at runtime is there some more functionaility I can access to do this. Any direction is appreciated!
Last updated: 2023-12-22
Post by mp9876 on Device User Logon
CODESYS Forge
talk
(Post)
Following up on the invalid user authentication on the target Not 100% sure what the problem was but following my post I managed to create an administrator level user. Then my next issue was that I could not connect to the device. I might have flipped the device from a 64 bit version to a 32 bit version so I did UPDATE DEVICE back to the 64 bit version; still could not connect somehow. Then I did two things at the same time that fixed my problem: Wiped the Codesys Control Win 64 bit version and installed the 32 bit version Installed latest Codesys Control Win V3.5 SP20 (released today) I wish I knew which one of these actions fixed the problem but at least the problem is solved. Hoping this post may help someone one day
Last updated: 2024-03-19
Post by fontrap on cmDongle Raspberry Pi issue
CODESYS Forge
talk
(Post)
Good morning @eschwellinger, After some research I found out that the problem is the preinstalled CodeMeter on Raspberry Pi. As I mentioned the CodeMeter was installed on the Raspberry because I use a license from other vendor that needs the CodeMeter to be installed. The problem is that when I uninstall the CodeMeter from Raspberry I am able to detect the dongle from CODESYS and everything works as it should be but now the other product can not detect its own license. When I reinstall the CodeMeter I am back to the initial problem. Is there a way to overcome this conflict through CODESYS?
Last updated: 2024-04-24
Post by shabroz-gill on Exception when OPCUA datasource disconnects from Server
CODESYS Forge
talk
(Post)
If i loose the network and the opcua data source suddenly looses connection with the server, i get an exception and my application stops working. I am using the latest version of the communication add v4.5.2.0 Is this a known issue? This makes the datasource unusable because it is inevitable that we will loose connectivity at some point, and the datasource crashing everything due to that seems to be a deal breaker. I can provide more details is someone from codesys is reading this. You can recreate is by just shutting off the Opc server after the codesys data source is connected and reading data from it. The codesys app does not crash everytime and sometimes it is able to reconnect without crashing, so you may have to try this a few times to see the exception. Best regards
Last updated: 2024-09-16
Post by ivanj on Codesys V3 + Rpi + PCA9685 + two robot arms
CODESYS Forge
talk
(Post)
greetings to everyone I have a system consisting of rpi3 computer with codesys v3 installed connected to one pca9685 through which the servo motors of the two robotic arms are connected (each robot arm has 6 motors) I managed to get that the pca9685 can only drive 4 servos on the first arm the other 2 on the same robot arm do not respond, nor do the remaining 6 they do not react on the other robotic arm. Power is connected to the pca9685 for motors of sufficient power or amperage. I tried to put another pca9685 but the same thing happens again. What is the possible problem?
Last updated: 2024-10-02
Post by royw on Profinet library for C#
CODESYS Forge
talk
(Post)
Hi, I don't know if I'm in the right place or if it's even possible... I'm looking for a way to address a Profinet device with Record Read and Write from my own PC. I actually only need very few commands to configure our device. This means setting the MAC address and a serial number. We would like to do this from a C# program. Now we are looking for a library or something similar. Since you can do it from Codesys, I thought there might be a DLL or something similar that you could use for this. As I said, we don't want real-time queries of the cyclic data but only record read/write. Does anyone have any helpful hint? Thanks in advance
Last updated: 2023-12-22
Post by fenicklar on Login problem with FileTransfer on Raspberry Pi 5
CODESYS Forge
talk
(Post)
Hello everyone, I'm currently trying to set up a FileTransfer function from a Webvisu to my Raspberry Pi 5 on Codesys 3.5 SP 19 Patch 6. I went in the files CODESYSControl.cfg and CODESYSControl_User.cfg and added : [CmpWebServerHandlerV3] AllowFileTransferServices=1 And it seems to be working. However, I cannot access my several Webvisu without putting my login. That's a problem because one of my webvisu is in kiosk mode on the raspberry itself and there is nokeyboard attached, it's just an information screen, but I can't view it. Is there a wey to enable the File Transfer without requiring to login ? Thank you for your time
Last updated: 2024-03-18
Post by struccc on Release SP20 - Changes in behaviour?
CODESYS Forge
talk
(Post)
Dear all, I've just started to migrate some of my ancient projects to SP20. There is one strange error (?) I have noticed so far. In a method call, depending on the circumstances I would like to return reference to an object, or an invalid reference: METHOD Add_EVT_OUT : REFERENCE TO FB_MSG VAR END_VAR IF __ISVALIDREF(refMSG_Entry) THEN Add_EVT_OUT REF= MANAGER.AddMsg_EVT_OUT( refMSG_Entry, _Get_EVT_Message(MSG_EVENT.OUT), _Get_EVT_AddCode(MSG_EVENT.OUT) )^; ELSE Add_EVT_OUT := 0; END_IF So far setting a reference variable to 0, did this. But now, the expression Add_EVT_OUT := 0; gives an error: [ERROR] DB_WTP_370: Add_EVT_ACK MSG_TRIGGER_EXT: C0032: Cannot convert type 'BIT' to type 'REFERENCE TO FB_MSG' Naturally... I can write: Add_EVT_OUT := DWORD#0; But is this the correct way? Is there any constant I could use instead, like "NULL"? Or this is totally wrong and to be avoided?
Last updated: 2024-03-24
Post by yannickasselin on codesys VLAN tagging
CODESYS Forge
talk
(Post)
Hi, I am looking for exactly the same thing. I would think that using a layer 2/3 managed switch should work but I am not convinced. I would like to test it in order to see if it would be possible to run many Codesys Docker instances on a server and run only 1 ethernet cable from the server to a managed switch closer to the machines beeing controlled instead of having to run multiple long ethernet cables. I was going to buy a managed switch in order to test it but I want to first make sure it is possible and I want to figure out exactly what kind of switch I would need. Is this even possible? I think this is a feature that would be very useful paired with "Codesys Virtual Control SL". Thank you
Last updated: 2024-09-07
Post by wbj0t on Raspberry Pi CM4. CoDeSyS files corrupted after hard reset.
CODESYS Forge
talk
(Post)
Hello everyone. Raspberry Pi CM4 after some 1 week of work was hard reset mannualy several times and after these hard resets User Management file was missed (when click login button, enter login/password, error: User Management File missed). Also programm can not open file via SysFile library, but this file exists and size of him is 0 bytes, but must be more any way (I keep some kind of archive via this lib). What happens, how files corrupted? Where do I need try to find this error of the codesys or system whole? In the log files of codesys nothing interesting about this happens. Thanks for reading Is this enough hold PlcLogic and SysFileMap.cfg as reserve copy in another place for restoring the programm? And how automate restoring actions if programm files corrupted?
Last updated: 2024-09-16
Post by mondinmr on Jitter problems on imx8
CODESYS Forge
talk
(Post)
We are experiencing serious jitter issues on an ARM64 imx8. Until now, on rpi and beaglebone derivatives, and on Intel, we never encountered jitter issues unless they were already present on the device. In this case, as can be seen from the attached graph, we have excellent maximum latency. The cyclictest on the isolated core dedicated to IEC CODESYS tasks shows a latency of 37Β΅s, with an average of 14Β΅s. Usually, on all other devices, with an RT kernel, with the appropriate parameters to avoid frequency throttling, with properly managed IRQs, and with the disabling of large page sizes, the jitter measured by CODESYS is very close to the cyclictest latency. However, on this imx8, we are noticing a fluctuating value of +/- 300Β΅s that seems to be added to this latency, as if something occasionally miscalculates the sleep times by exactly +/- 300Β΅s. Two screenshoot attached. - Result of cyclictest - Jitter on CODESYS Tasks are assigned to isolated core!
Last updated: 2023-10-18
Post by zoronoa on J1939.ReceiveWatchdog & J1939.ReceiveParameterGroup
CODESYS Forge
talk
(Post)
Hi, I'm trying to monitor a specific PGN which I have it sending a pulse every 500mS Problem: Using the Watchdog for the ECU does not really help me as I have multiple instances with separate PGNs, if a PGN goes ghost, the ECU watchdog won't be flagged as the others will be running. I found the J1939.ReceiveWatchdog & J1939.ReceiveParameterGroup function blocks and they seem like a good solution for my problem, I just can't get them to work from my understanding you just build the J1939.ReceiveParameterGroup once and then connect it's output to the J1939.ReceiveWatchdog, here's my CODE for the setup HEARTBEAT_TIMER(IN:= TRUE, PT:= T#1000MS); //turn-on delay because of initialization race IF HEARTBEAT_TIMER.Q= TRUE THEN Glob_Var.DisplayReceive.xExecute:= TRUE; Glob_Var.DisplayReceive.itfECU:= Valve_X; Glob_Var.DisplayReceive.dwPGN:= 65511; Glob_Var.DisplayWatchdog.xEnable:= TRUE; Glob_Var.DisplayWatchdog.itfParameterGroup:= Glob_Var.DisplayReceive.itfParameterGroup; Glob_Var.DisplayWatchdog.tTimeout:= T#1500MS; END_IF Notes: Glob_Var.DisplayReceive is of type J1939.ReceiveParameterGroup Glob_Var.DisplayWatchdog is of type J1939.ReceiveWatchdog The above code is done once and not cyclically I'm monitoring Glob_Var.DisplayWatchdog.xError cyclically
Last updated: 2024-03-13
Post by andrax on CodeSys Raspberry pi I2C driver not found
CODESYS Forge
talk
(Post)
Hi, Communication with the ADS1115 is actually simple. 1. write config 2. write address pointer 3. read conversation register The ADS1115 works like a multiplexer. This means that you do this individually for each channel that you want to read. e.g: Channel 1: write config > write address pointer > read conversation register Channel 2: write config > write address pointer > read conversation register Channel 3: write config > write address pointer > read conversation register Channel 4: write config > write address pointer > read conversation register then you start again from the beginning You can also omit individual channels or read only one. It doesn't matter. I have written the driver so that I can also use it on the TCA9548. The driver is from Stefan Dreyer. In your case, the driver works and communication with the ADS1115 is running. As you can see, the cfgWrong:=FALSE If you could not write or read data, cfgWrong:=TRUE; This means that either something is wrong with your ADS1115 or you have connected something incorrectly. Question: what voltage do you want to measure?
Last updated: 2024-11-08
Post by hwillems on Ranges, Lambdas, on Fixed arrays of structs
CODESYS Forge
talk
(Post)
I do datastructures and algorithms in Codesys. For example a Struct of Person with thing's like IdNumber, Name, Age etc. as example. Now i do all kind of calculations, filters. So i have this pretty big Fixed Array with Structs. On this struct i want to do simple stuff you can do easily in C++/Python/Rust etc. For example i want to do this: AvererageAge := Average(Peoples.Age); Then it will return the average of all members ages. Or Sort struct on age etc. Or sort on alphabetical Name. Or use Lambda functions to filter/mutate out things like, filter out everybody above 18 years old. Or remove people who it's name start with "A". Currently i have to write my own custom function for example sorting on Age. And make a super specific function based on that particulare datastructure. Here an Example: (*Before calling this FIlter method, set the mNodeFilterSwitch to the desired filter.*) CASE mNodeFilterSelect OF (********************************[ Status Filters ]***********************************) NodeID: FOR x := ACS_OUT_BEGIN TO ACS_OUT_END BY 1 DO FOR y := ACS_IN_BEGIN TO ACS_IN_END BY 1 DO IF marrNode[y].Status.oiNodeID > marrNode[y + 1].Status.oiNodeID THEN mNodeTemp := marrNode[y + 1]; marrNode[y + 1] := marrNode[y]; marrNode[y] := mNodeTemp; END_IF; END_FOR; END_FOR; Started: FOR x := DES_OUT_BEGIN TO DES_OUT_END BY -1 DO FOR y := DES_IN_BEGIN TO DES_IN_END BY -1 DO IF marrNode[y].Status.oxStarted > marrNode[y - 1].Status.oxStarted THEN mNodeTemp := marrNode[y - 1]; marrNode[y - 1] := marrNode[y]; marrNode[y] := mNodeTemp; END_IF; END_FOR; END_FOR; Starting: FOR x := DES_OUT_BEGIN TO DES_OUT_END BY -1 DO FOR y := DES_IN_BEGIN TO DES_IN_END BY -1 DO IF marrNode[y].Status.oxStarting > marrNode[y - 1].Status.oxStarting THEN mNodeTemp := marrNode[y - 1]; marrNode[y - 1] := marrNode[y]; marrNode[y] := mNodeTemp; END_IF; END_FOR; END_FOR; END_CASE; I have like 30+ of these in the enum. Not really DRY code right? These are custom made bubble sort filters in a function. You pass in the Datastructure, and say what function you want. (This is an enum collection of sorting functions) And then the Array with Nodes of Structs gets ordered. Why can't we have Iterators and Lambda's and build in standard functions like regular languages? Also i use bubble sort because it's the easiest to implement because i can't get this to code DRY. Problem with ST (Even the new one with classes) that it's very limited for programming datastructures and algorithms. Yes you still not want dynamic memory and you need to choose the correct algorithm so you know the most extreme edge cases regarding the time it takes to execute the algorithms.(Real-time execution) How are other people dealing with this? Here for example saw some software using an adjusted ST language and having FOR EACH possibility: https://www.fernhillsoftware.com/help/iec-61131/structured-text/st-for-each.html You can then build your own custom Iterator functions. I wish the IEC 61131-3 standard would be more expressive and having more standard modern features, but still keep close to the fact of no dynamics memory and real-time systems.
Last updated: 2023-08-31
Post by mondinmr on Shared Memory Access Issues
CODESYS Forge
talk
(Post)
In Windows I need create shared memory in PC software and connect from CODESYS. If shm is not GLOBAL doesn't work due different users between runtime and PC software. PC software need admin privileges. Name need "Global\\" before key. Very unsafe!!! If CODESYS create shared I cannot find key PC side. In Linux I can create shared memory as standard user, bind in the runtime docker, use keys without any "Global\\". Much more safe!!! If CODESYS create shared you need play with permissions to use app as standard user. I prefer create form PC software as standard user.
Last updated: 2024-01-30
Post by wildcard on Modbus Client Request Not Processed
CODESYS Forge
talk
(Post)
Hi, does anyone has a solution for this issue. I've the same problem. I've implemented a very simple client based on the Modbus Examples and connected the soft PLC to a Modbus Simulator. PROGRAM ModbusClient VAR initDone : BOOL := FALSE; errorID : ModbusFB.Error; client : ModbusFB.ClientTCP; timeout : UDINT := 500000; replyTimeout : UDINT := 200000; aUINT : ARRAY [0..8] OF UINT; clientRequestReadHoldingRegisters : ModbusFB.ClientRequestReadHoldingRegisters; clientRequestsCnt : UINT := 0; clientRequestsProcessCnt : UINT := 0; ipAddress : ARRAY[0..3] OF BYTE := [10,54,0,72]; END_VAR IF NOT initDone THEN initDone := TRUE; client(aIPaddr:=ipAddress, udiLogOptions:=ModbusFB.LoggingOptions.All); client(xConnect:=TRUE, ); clientRequestReadHoldingRegisters(rClient:=client, udiTimeOut:=timeout, uiUnitId:=1, uiStartItem:=0, uiQuantity:=4, pData:=ADR(aUINT[0]), udiReplyTimeout:=replyTimeout); clientRequestReadHoldingRegisters.xExecute := TRUE; clientRequestsCnt := 0; END_IF clientRequestReadHoldingRegisters(rClient:=client, udiTimeOut:=timeout, uiUnitId:=1, uiStartItem:=0, uiQuantity:=4, pData:=ADR(aUINT[0]), udiReplyTimeout:=replyTimeout, xExecute := TRUE); IF clientRequestReadHoldingRegisters.xError THEN clientRequestsCnt := clientRequestsCnt +1 ; errorID := clientRequestReadHoldingRegisters.eErrorID; END_IF clientRequestReadHoldingRegisters(rClient:=client, udiTimeOut:=timeout, uiUnitId:=1, uiStartItem:=0, uiQuantity:=4, pData:=ADR(aUINT[0]), udiReplyTimeout:=replyTimeout, xExecute := NOT clientRequestReadHoldingRegisters.xExecute); When the system is running I do get the following on the logs: 2024-05-13T10:18:07.443Z: Cmp=MODBUS lib, Class=1, Error=0, Info=0, pszInfo= Client.RequestProcessed ClientRequest,16#0164ADC561A0 unitId=1 fc=ReadHoldingRegisters id=2070 state=Error 2024-05-13T10:18:07.443Z: Cmp=MODBUS lib, Class=1, Error=0, Info=0, pszInfo= ClientRequest,16#0164ADC561A0 unitId=1 fc=ReadHoldingRegisters id=2070 change state Error -> None timestamp=63843421226 2024-05-13T10:18:08.444Z: Cmp=MODBUS lib, Class=1, Error=0, Info=0, pszInfo= ClientRequest,16#0164ADC561A0 unitId=1 fc=ReadHoldingRegisters id=2071 change state None -> Init timestamp=63844421420 2024-05-13T10:18:09.444Z: Cmp=MODBUS lib, Class=1, Error=0, Info=0, pszInfo= ClientRequest,16#0164ADC561A0 unitId=1 fc=ReadHoldingRegisters id=2071 change state Init -> Error timestamp=63845421675 But the errorID is jumping between OK and RequestNotProcessed. Any help is very appreciated which gives me a hint what I'm doing wrong. Thanks
Last updated: 2024-05-13
Post by eschwellinger on communication
CODESYS Forge
talk
(Post)
depends on if you use PFC200 SL from CODESYS store or the Wago target for the PFC. If you use the SL product you need to setup the interface by a plcshell command...
Last updated: 2023-08-19
Post by jegerjon on Find index based on values
CODESYS Forge
talk
(Post)
Hi, I need to figure out witch indexes of an Array containing the highest and lowest values. Typically search for the 5 lowest values and result the indexnumbers containing the 5 lovest values. is there a library for this, or codeexample?
Last updated: 2023-08-20
Post by jegerjon on Find index based on values
CODESYS Forge
talk
(Post)
Hi, I need to figure out witch indexes of an Array containing the highest and lowest values. Typically search for the 5 lowest values and result the indexnumbers containing the 5 lovest values. is there a library for this, or codeexample?
Last updated: 2023-08-20
Post by sven01 on Documentation / Usage Help For Scripting Engine Libraries
CODESYS Forge
talk
(Post)
Hi, I am still not able to figure out how to use the the classes and their functions. π Let's say I would like to use the function "importfile()" from the class "ScriptTextListObject.ScriptTextListMarker". I would be grateful for an additional example. Thanks! π
Last updated: 2023-08-21
Reading from a file, a line of CSV values with CrLf at the end of the line.
CODESYS Forge
talk
(Thread)
Reading from a file, a line of CSV values with CrLf at the end of the line.
Last updated: 2018-09-18
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
.