Post by rafael on Wbm/runtime and visualization login
CODESYS Forge
talk
(Post)
Hello everyone, I’m trying to understand if it is this way or I can change it. I’m making a PLC code and visualization screens, the ideia is to operate via webvisu some controls. So i made a code, made some screens and when i try it in my web browser, first it asks me to insert te user and password of the wbm/runtime of the plc (user: admin, password: wago by default), then i can acess my screens but I have to login again with the user and password that i created in the visualization user managment. My question is: is there a way to disable this first login to the visualization screens (webvisu)? Or create another user/password for this first screen? I have a PFC200 and a Edge Controller, both are working the same way. Thanks in advance Thanks
Last updated: 2024-06-25
Post by alez on CANopen safety , SRDO error behavior
CODESYS Forge
talk
(Post)
I have a project in which there is a Safety device in CANopen, and the PLC interfaces with it as Master. I would like to understand if it is possible to set the behavior in case one of the SRDOs that I receive from the slave is no longer received. From what I have seen, if the SRDOs are not received, the CANopen safety status becomes "Not in progress" and the mapped variables freeze at the last value detected. I want to understand if it was possible to set the variables connected to the SRDOs to take a default value (e.g. zero) in the event of a CANOpen error during reception.
Last updated: 2024-07-15
Post by toffeebonbon on EL7041-0052 - does it run with EL7041 SoftMotion?
CODESYS Forge
talk
(Post)
I let this project rest for a while and picked it up last week. I have been in contact with the support from beckhoff and got the information that the terminals were identical (communication wise). As the Log of the Axis (not the drive's log) shows the error when trying to write into the register 0x8012 and set the value for an encoder to a value that is the default - at least according to the manual - I was wondering if it is possible to "not write that value" to skip that part? Or am I misunderstanding the way the library communicates with the drive?
Last updated: 2024-07-24
Post by timvh on FB string and naming
CODESYS Forge
talk
(Post)
I see, you want to initialize the FB. To be able to initialise it like you described, you need to add the FB_Init method to your FB. (right click on the FB, select add object --> method). Then press the arrow down, to select the FB_Init (overwrite default implementation). In the VAR_INPUT section of this method, add the variable --> Tag : STRING; Then in the code section of this method add: THIS^.Tag := Tag; // copy initial value to local variable in FB Search Google if you want to know more about FB_Init. PS, reflection + instance path, is also an option if you want to get the full name of the instance (path) of the Function Block. See: https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_pragma_attribute_instance_path.html
Last updated: 2024-09-30
Post by ricola on Change default node Id name on Raspberry Pi
CODESYS Forge
talk
(Post)
EDIT : https://forge.codesys.com/forge/talk/Engineering/thread/cb5a492aa0/ hyplcmotion - 2022-12-16 Found out how! Needed to connect to PFC200 via Putty, and open CodesysControl.cfg with “sudo nano /etc/CODESYSControl.cfg”. Then adding following command to the end of file, and use the name you want, save/close CODESYSControl.cfg, and reboot your PLC. [CmpOPCUAProviderIecVarAccess] CustomNodeName= PFC200 Hi! , I'm digging up this issue cause we have still this long name within current versions on CodesysControl. Is it a lock for "demo" licences or can it be changed in some way ? This DeviceSet name is too way long with spaces inside, not easy to handle with string parsing... Cheers !
Last updated: 2024-10-10
Post by mabac on No file found
CODESYS Forge
talk
(Post)
CODESYS introduced many cyber security related changes over the last few years, one of them is to restrict file access. By default, file access is restricted to the PlcLogic folder and subfolders of the CODESYS control runtime of version 3.5.19.0 and newer. For Control Win this would be the folder C:\ProgramData\CODESYS\CODESYSControlWinV3x64\xxxxxxxx\PlcLogic\ To enable access to other folders, you can configure additional paths by adding them to the file CODESYSControl.cfg. For example: [SysFile] FilePath=C:/temp/test FilePath.1=C:/Users/Public You should now be able to access your file in C:\temp\test\ or in C:\Users\Public
Last updated: 2024-10-30
Post by struccc on Wish: CODESYSControl.cfg - again
CODESYS Forge
talk
(Post)
Before creating this topic, I was browsing the search results for CodesysControl.cfg - many results, and I remember very well, it's a problematic issue for a long time. To summarize: there were many requests for documentation on this file - the most comprehensive reply is: https://forge.codesys.com/forge/talk/Runtime/thread/ebbf851a3d/#eb85 Hi, not really, this is covered by the manual which you get if you use a runtime toolkit which is not free of charge. Maybe we need to extract the config file part from that documentation if that is possible. BR Edwin I am not sure how much is this relevant, since we buy SL License directly from CODESYS... I think it is a reasonable demand, to get documentation on the configuration entries affecting the documented behaviour of the runtime system and it's components The actual reason I bring up this issue again can be read here: https://forge.codesys.com/forge/talk/Runtime/thread/febad3cc40/#0e12 but mostly my frustration about noticing some new, unknown and undocumented entries in my configuration file. Again. And this happens a lot recently. Just some examples: Changes with SysFile - and mandatory use of IEC path Introduction of Mandatory user management File transfer service now disabled by default SysProcess - allowed commands The above mentioned CmpApp parameters... And finally (Regaridng windows install): With the newer versions, the installation directory (together with the configuration file) tends to hide itself to some super silly location under the roaming profile data of local system account. I am not sure if this change was documented somewhere, but was a very unpleasant one. Someone could please explain the reason and the concept of the introduction of this release specific directories (I am sure, there is a good reason) - how to use them properly? - How to re-introduce user configuration (to preserve configuration data between versions)? - How to do version - to version migrations properly? - How to keep old version of runtime available and ready to start with it's original configuration and application? - ... Therefore, the lack a regularly updated description of CodesysControl .cfg , including all the configuration entries, together with their default values for different runtime versions is really a big deficiency.* This should be done for all components storing or just seeking data from this file... (Maybe there is such thing but I failed to find???) It is regularly causing trouble when introducing a new version (together with the long awaited bug fixes and enhancements), what has changed it's default behaviour for security or other practical reasons. I agree this is very important, and it is logical to change the default options: But it must be documented historically, and make it easily available, so we can prepare better for the upgrade of the runtime. Forge talk is a great source, but not very practical for this kind of documentation purposes... Thanks in advance for CODESYS staff 🙏🙏🙏 (Ps.: It would look rather silly, if some members of the user community prepares this documentation on a Forge Wiki page... Or??? Should we?)
Last updated: 2024-11-21
Post by kut69 on Retain / Persistent Variables in Codesys for Raspberry Pi
CODESYS Forge
talk
(Post)
Hi, I am interested in details about the .ret file in the filesystem. I have already a project where the file is used (write on demand, read by start) and I want to share it as 'default input' for test devices using the identical application. Opening the .ret file content in a hex editor (I only use a single string retain var) I asked myself what the meaning of the first 24 bytes is. It neither contains a handle to the application nor a reference to the variable. Is this maybe a timestamp? Or a CRC/checksum? Regards, Thomas
Last updated: 2025-05-19
Post by edson-bueno on IFM Controller Connection Issue
CODESYS Forge
talk
(Post)
Hi, Could you please send an print of your ethernet adapter info? Ip addr Subnet Mask Default Gateway Also, check if the gateway service is active in your windows. Win+R > services.msc > Look in the list CODESYS Control Win V3 x64 Gateway OR CODESYS Gateway V3 Hook up the M12 code D into the ETH port, supply the controller, it should apperars to you. Make sure when you try to connect with the controller, the target of your project has to match with the controller. Otherwise, click on the device in the devices tree > Communications Settings tab > Device > Options > And disable "Filter Network Scans by Target ID". Good luck.
Last updated: 2025-05-29
Post by r-niedermayer on C0564 Warning Message
CODESYS Forge
talk
(Post)
Please see or Online Help on how to initialize variable before using them: https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_pragma_attribute_global_init_slot.html Regarding the Attribute global_init_slot: You can use this pragma to influence the order in which signatures are processed during global initialization. It can only be applied to signatures. By default, the initialization sequence for variables from global variable lists is undefined! However, if, for example, variables from one list depend on variables from another list, it is necessary to initialize one before the other. (Aee OLH and Syntax) The placeholder <slot> must be replaced by an integer value that defines the position in the initialization sequence.</slot> The default value is 50000. A lower value causes an earlier initialization! If several signatures have the same value for the 'global_init_slot' attribute, the order of their initialization remains undefined! Cautious application should therefore be considered! Example: The project contains f.e. two global variable lists GVL_1 and GVL_2. The global variable "A" is part of the global variable list GVL_1: {attribute 'global_init_slot' := '300'} VAR_GLOBAL A : INT:=1000; END_VAR The initialization values of the variables "B" and "C" of GVL_2 are dependent on the variable "A". {attribute 'global_init_slot' := '350'} VAR_GLOBAL B : INT:=A+1; C : INT:=A-1; END_VAR So if you set the 'global_init_slot' attribute of the global variable list GVL_1 to 300, i.e. to the lowest initialization value in the example, then it is ensured that the expression "A+1" is well-defined at the time of initialization of "B".
Last updated: 2024-01-30
Post by leandroct on Error reading files after runtime update from 4.0.0.0 to 4.8.0.0
CODESYS Forge
talk
(Post)
Since version 19 they changed how file access is handle. There are two solutions: 1. You change where the file is stored (need to go to: /PlcLogic/) 2. You can, if you don´t want to store at PlcLogic, add the following line in the CODESYSControl.cfg under [SysFile]: ForceIecFilePath=0 The CodesysControl.cfg is at C:\ProgramData\CODESYS\CODESYSControlWinV3x64\xxPROJECT_NUMBERxx\ Here the email they sent me: "with the 3.5.19 Version we changed how files are handled. See following issue: CDS-81506 - CODESYS Control SysFile system file access vulnerability. There are two solutions: 1. You change where the file is stored (need to go to: /PlcLogic/) 2. You can, if you don´t want to store at PlcLogic, add the following line in the CODESYSControl.cfg under [SysFile]: ForceIecFilePath=0 Here is the official release-note: [[COMPATIBILITY_INFORMATION]] With the activation of ForceIecFilePath the file access from IEC is now restricted to the configured paths only (file sandbox)! [SysFile] ForceIecFilePath=1 (new default) The standard path is the current directory, the PlcLogic subfolder or a configured path. Every file access outside of this path is configured via PlaceholderFilePath, for example access to temporary files or removable media: [SysFile] PlaceholderFilePath.1=/tmp, $TMP$ PlaceholderFilePath.2=/media/usb, $USB$ PlaceholderFilePath.2.Volatile=1 For more information see our tutorial FilePath & Placeholders. To restore the old behavior ForceIecFilePath may be configured as follows: [SysFile] ForceIecFilePath=0 BUT WE HIGHLY RECOMMEND TO LEAVE THIS SETTING AT ITS NEW DEFAULT VALUE! "
Last updated: 2024-05-07
Post by annd on Migration von "CODESYS Control for PFC200 SL" zu WAGO FW26 "CODESYS V3.5.19.2"
CODESYS Forge
talk
(Post)
Hallo, da Wago nun von eCockpit zum offenen "CODESYS Development System V3" wechselt, möchte ich meinen bestehenden 750-8212 von der PFC200 SL auf die Wago Firmware umstellen. Welche Schritte sind dabei notwendig? Den Controller würde ich auf die aktuelle FW 26 updaten und die 3.5.19.2 von Wago mit den Descriptions verwenden. Reicht es im Codesys Projektbaum mit "Gerät aktualisieren" auf den Wago Controller zu wechseln? Es wird dann statt dem "Pfc200Bus"ein leerer K-Bus und ein leerer Com-Port angezeigt. Müssen die einzelnen Module dann darunter neu angelegt und alle E/A Variablen manuell neu eingetragen werden? Das exportieren und danach wieder importieren funktioniert nicht, weil die Namen bzw. Adressen unterschiedlich sind. Ist das so richtig? Kann der Block "Modbus_COM_Port - Modbus_Master_COM_Port - Modbus_Slave" so bleiben wie bisher oder muss das auch unter dem neuen COM-Port neu angelegt werden? Für ein paar Hinweise wäre ich dankbar. Schöne Grüße, annD
Last updated: 2023-11-17
Post by vahasa on CAN TPDO / RPDO
CODESYS Forge
talk
(Post)
Hi I'm automation engineering student and I'm not yet quite familiar with CAN-bus. What I am trying to achieve, to send two byte message via CAN from Epec display to Scott Drive inverter. I'm using code template made with Epec Multitool in Codesys 3.5 Problem i'm facing is that drive responds with same COB-ID. In multitool, you can create TPDO/RPDO. And depending on that, display either sends or only receives. This is problem, because for parameter polling from drive, you need to send two byte request to 0x399 and drive responds with eight bytes. If request is longer, drive don't respond. 0x399 is currently setted as RPDO, so display doesn't send anything on startup and I made program that sends messages to 0x399 bytes 0 and 1 and bytes 3-7 are shown in display. If setted as TPDO, display send all eight bytes and therefor drive cannot respond. But, I think because they are defined as RPDO, display won't send message, although monitoring with Codesys, values are changed. Question is, how should COB-ID be configured in Codesys, so it wouldn't automatically start to send message but would send when needed?
Last updated: 2023-12-19
Post by tama00 on GPIOs not running with Raspberry Pi 4 (and SPI connection)
CODESYS Forge
talk
(Post)
Hello everyone, I have a working SPI connection (with transferExt) between a Raspberry master with Codesys and an ESP32 slave. I would also like to use a few GPIO pins. Is there a problem with using SPI AND GPIOs? Environment: Raspberry Pi 4+ with Raspian from Oct 23 Codesys V3.4 SP19 Patch 5 with Runtime Version 4.10.0.0 Device: GPIOs B+/Pi2 My problem: The status is displayed as “GPIOs : not running”. And also during mapping the message “The bus is not running. The values shown are perhaps not actual”. However, the variable changes that I make in my program are displayed under “Current Value”. In the Logic Analyzer, the pin toggles during transmission with small intervals of +-4us (seems to be a cyclical disorder, but I don't know where exactly it could be coming from). This applies to pins that I actually use (output) but also to the other GPIOs (not used). With GPIO 4, the line remains permanently high. Attached is a screenshot from the Logic Analyzer. Channel 1,3,5 were GPIO pin 26, 22, 17 Would be very grateful for help. Best regards
Last updated: 2024-05-06
Post by ahuckphin on Issues with Modbus Slave with Raspberry Pi
CODESYS Forge
talk
(Post)
I have a DFRobot RS485 temperature & humidity sensor (SEN0438) connected to my Raspberry Pi via a USB to RS485 adapter. I am able to connect and read the sensor data when running a python code locally. However in Codesys, I encounter this error "A bus error has occurred." and "There was no response in time". Could this be because of Modbus Server Channel and Modbus Server Init configuration on my part? Admittedly I am new to Codesys. To get to this stage, I: 1. added some lines to CODESYSControl_User.cfg 2. added "Modbus_COM" in Codesys and set "Serial Port Configuration" under "General" 3. added "Modbus_Master_COM_Port" in Codesys and checked transmission mode is set to "RTU" 4. added "Modbus_Slave_COM_Port" in Codesys and checked server address is set to 1 (also set 1 in my sensor) 5. added 1 channel and 1 init for "Modbus_Slave_COM_Port" under "Modbus Server Channel" and "Modbus Server Init"
Last updated: 2024-07-10
Post by andrax on Bosch BME 280 bzw 688 Sensor per I2C Bus steuern und Daten in Codesys verarbeiten
CODESYS Forge
talk
(Post)
Die Geräte Bibliothek von Stefan Dreyer ist dafür gedacht, um Treiber für deine Sensoren zu erstellen, damit sie an einem MUX-Board betrieben werden können. Auch ist ein Betrieb ohne MUX-Board möglich. Der Aufbau ist relativ einfach und besteht aus folgenden Komponenten: -Initialize (hier wird die .devdesc.xml eingelesen) -BeforeWriteOutputs (ruft initDevice auf und ist für ausgehende Signale gedacht) -initDevice (initialisiert den Sensor) -AfterReadInputs (Selbsterklärend, Werte einlesen und Signalkonversation) Bei meinen Sensoren habe ich es immer so gemacht. Zuerst habe ich mit die .devdesc.xml gebaut bzw. eine Vorlage umgeschrieben, wobei Parameter 1-10 für ein Mux-Board reserviert sind. In der .devdesc.xml definierst du alle wichtigen Parameter für den Sensor. Danach schreibst du die Initialize und liest die Werte ein. InitDevice ist Fleißarbeit. Für die meisten Sensoren liegt immer ein Pythonscript oder was in C bei. Du gehst die Scripte durch und baust es in Codesys nach. Im letzten Schritt baust du die AfterReadInputs. Signale einlesen und Conversation. Du solltest dir auch ein I2C-Logic Analyzer zulegen. Da Teil ist sehr hilfreich um die I2C Kommunikation mitzulesen. Wenn es irgendwo klemmt, siehst du sofort an welcher Stelle du suchen musst. Ich hab hier den AZ-Delivery Logic Analyzer! Grüße Andre
Last updated: 2025-01-11
Post by testlogic on Sending Sequential Modbus TCP Packets
CODESYS Forge
talk
(Post)
I have a Modbus TCP slave device where I need to do sequential writes to the same register. The register I'm writing to is kind of like a command line, each packet is a command word encoded in Hexadecimal. I am having difficulty implementing this system in CoDeSys 3.5 SP19. I feel like the structure of the program should be something along the lines of (Pseudocode): ModbusTCPSend(Command Register, Command1) ModbusTCPSend(Command Register, Command2) ModbusTCPSend(Command Register, Command3) I have tried to implement this with a rising edge trigger wMot1OPCode := 16#E1; //Stop Motor & Kill Program xMot1SendOP := TRUE; //Send OP on rising edge xMot1SendOP := FALSE; //Reset wMot1OPCode := 16#9E; //Disable Motor xMot1SendOP :=TRUE; //Send OP on rising edge xMot1SendOP := FALSE; //Reset Where "wMot1OPCode" is the IO map for writing to the command register, and "xMot1SendOP" is the rising edge trigger for that modbus channel. However, this doesn't work. The device never responds to the modbus commands. It seems like the trigger variable is switched too quickly for modbus to send the packet. I know the modbus register is working, because I can set the channel to cyclic and the device will respond. However, I can't use this reliably because I need each command to be sent once, in order. Cyclic keeps re-sending the commands and seems like it could miss a command as well if one was sent in-between cycle time. I have also trying using the Application trigger as described by https://faq.codesys.com/pages/viewpage.action?pageId=24510480, but this is also not working for me. See attached picture for my FBD code. This seems like a simple function, I can't tell what I'm doing wrong here. Thanks for the help.
Last updated: 2024-03-06
Post by mubeta on Some 'pathetic' errors in SoftMotion program
CODESYS Forge
talk
(Post)
Yes, this is the error the sometimes show up. What make me crazy is the fact that it happens randomly and not each times. I know very well where the problem is, in wich one program row it's located. For each actions of the state machine I have all events recorded with log on text file. it is not problematic for me to find the application point of the fault, but I need to understand why occasionally and for no apparent reason, switching the state machine and thus changing the motion FB, sends the axis into failure (but only occasionally). For example, one case that is often problematic is the execution of the Axis Halt instruction. When, after a MoveAbosulte instruction this returns the event as 'done' and indeed the axis is in standstill, the state machine first sets the move instruction to FALSE, and the next cycle sets the Halt request to TRUE. Some of the time everything works out fine. Occasionally, however, in this exchange, the axis goes into fault, also losing the OPERATIONAL state. Meanwhile, I would like to understand why the motion FB instances must still be called even after the Execute is set to FALSE, especially in view of the fact that the next instruction is programmed to abort the previous one, with BufferMode set to 'Aborting'. All these unnecessary FB calls are an unnecessary overhead on the CPU anyway. Is there any precise rule about when to cease calling the various instances? (It should precisely be the 'done' status that says this one has finished its work).
Last updated: 2024-07-18
Post by ara32 on CODESYS 4 Linux:
CODESYS Forge
talk
(Post)
Hello! I managed to correctly launch CODESYS Developer Studio 3.5.17, almost all functionality works. The only issue remaining is that when connecting to a device and obtaining its public key, the NCryptEncrypt function is called, which is not fully implemented in the DLL source code, resulting in the connection not being established. Currently, the code of this function in the Wine repository looks like this: SECURITY_STATUS WINAPI NCryptEncrypt(NCRYPT_KEY_HANDLE key, BYTE *input, DWORD insize, void *padding, BYTE *output, DWORD outsize, DWORD *result, DWORD flags) { struct object *key_object = (struct object *)key; TRACE("(%#Ix, %p, %lu, %p, %p, %lu, %p, %#lx)\n", key, input, insize, padding, output, outsize, result, flags); if (flags & ~(NCRYPT_NO_PADDING_FLAG | NCRYPT_PAD_OAEP_FLAG | NCRYPT_PAD_PKCS1_FLAG | NCRYPT_SILENT_FLAG)) { FIXME("Flags %lx not supported\n", flags); return NTE_BAD_FLAGS; } if (flags & NCRYPT_NO_PADDING_FLAG || flags & NCRYPT_PAD_OAEP_FLAG) { FIXME("No padding and oaep padding not supported\n"); return NTE_NOT_SUPPORTED; } if (key_object->type != KEY) return NTE_INVALID_HANDLE; return map_ntstatus(BCryptEncrypt(key_object->key.bcrypt_key, input, insize, padding, NULL, 0, output, outsize, result, flags)); } The program crashes due to the NCRYPT_PAD_OAEP_FLAG flag. I'm not proficient in C++, but I attempted to add handling myself, and here's the result: SECURITY_STATUS WINAPI NCryptEncrypt(NCRYPT_KEY_HANDLE key, BYTE *input, DWORD insize, void *padding, BYTE *output, DWORD outsize, DWORD *result, DWORD flags) { struct object *key_object = (struct object *)key; TRACE("(%#Ix, %p, %lu, %p, %p, %lu, %p, %#lx)\n", key, input, insize, padding, output, outsize, result, flags); if (flags & ~(NCRYPT_NO_PADDING_FLAG | NCRYPT_PAD_OAEP_FLAG | NCRYPT_PAD_PKCS1_FLAG | NCRYPT_SILENT_FLAG)) { FIXME("Flags %lx not supported\n", flags); return NTE_BAD_FLAGS; } if (flags & NCRYPT_NO_PADDING_FLAG) { FIXME("No padding not supported\n"); return NTE_NOT_SUPPORTED; } BCRYPT_OAEP_PADDING_INFO oaepInfo = { 0 }; oaepInfo.pszAlgId = BCRYPT_SHA1_ALGORITHM; NTSTATUS status = BCryptEncrypt(key_object->key.bcrypt_key, input, insize, &oaepInfo, NULL, 0, output, outsize, result, flags); if (key_object->type != KEY) return NTE_INVALID_HANDLE; return map_ntstatus(BCryptEncrypt(key_object->key.bcrypt_key, input, insize, padding, NULL, 0, output, outsize, result, flags)); } Now, when calling the connection, it crashes with the error "bcrypt:BCryptEncrypt flags 0x4 not implemented." Can anyone help with enhancing this functionality or at least point me in the right direction?
Last updated: 2024-03-22
Post by critcho on WebVisu Numpad dialog - Dialogtitle not accepting string variable
CODESYS Forge
talk
(Post)
I have a WebVisu page which is re-used for multiple types of gas; it displays the alarm thresholds etc. for one gas at a time. I have an array of structures holding the set-points for each of the gasses. I'm trying to change the dialog title for the value input pop-up (VisuDialogs.Numpad). The Dialogtitle is set to Gas_Alarms.HighAlarmActivationLevelDialog, which is a string(50): When the gas type is changed (page first loaded, or prev/next buttons), METHOD Gas_Alarms.Update_Display_Variables is called, to update the strings used for the dialog titles so it shows GasName High Alarm Activation Level (EngineeringUnits), e.g. CO2 High Alarm Activation Level (PPM): HighAlarmActivationLevelDialog := Insert(' High Alarm Activation Level ()', EngineeringUnits, 30); HighAlarmActivationLevelDialog := Insert(HighAlarmActivationLevelDialog, GasName, 0); (That's not where the problem is, I'm just explaining why I'm using a variable dialogue title.) The variables used are definitely strings, but i'm always getting the error: "The type of the dialog title must be either STRING or WSTRING". I've tried moving HighAlarmActivationLevelDialog etc. to the GVL and also changing them to WSTRING, I even tried adding them to the structure array, but I always get the same error. Clearing the dialog title for that element removes the error - so I'm confident it's not a phantom error caused by something else. But I should be able to add these titles, can't just nuke them all to make it work. The MinVal and MaxVal for the Numpad are called from the array, e.g. GVL.Gas_Alarm_Configs[0].ScaledValueMIN, they are not getting an error. I am using array indexes 1 - 5 for the gasses, when I load the form or change gas, I copy the selected index to index 0 of the array, and values from Gas_Alarm_Configs[0].[ALL] are displayed on the page. When they hit save, I copy Gas_Alarm_Configs[0].[ALL] to Gas_Alarm_Configs[CurrentGasIndex].[ALL]. (ALL just means every element, I can't figure out how to display an asterix in this question... :) ) I've searched online for variable title dialog, but not found anything to help. Thanks for your help!
Last updated: 2025-05-29
Post by ryusoup on JSONByteArrayWriter problem?
CODESYS Forge
talk
(Post)
Hello, I am trying to implement a FB to make JSON formatted WSTRING type message using JSON Utilities 1.9.0.0 included in the IIoT library. In my case, I want to set some objects or arrays and set values to them later. But when I wrote as the sample below, // init builder builder(pJsonData:=pJsonData, diRootObj=>diRootObj); // set the 1st key to root diKey1 := builder.SetKeyWithArray(wsKey:="key1", diParentIndex:=diRootObj, eError=>eError); // set a value to the 1st key wsValue:="value01"; builder.SetValue(Value:=wsValue, diParentIndex:=diKey1, eError=>eError); // set the 2nd key to root diKey2 := builder.SetKeyWithArray(wsKey:="key2", diParentIndex:=diRootObj, eError=>eError); // set a value to the 2nd key wsValue:="value02"; builder.SetValue(Value:=wsValue, diParentIndex:=diKey2, eError=>eError); // set a value to the 1st key again wsValue:="value03"; builder.SetValue(Value:=wsValue, diParentIndex:=diKey1, eError=>eError); // set a value to the 2nd key again wsValue:="value04"; builder.SetValue(Value:=wsValue, diParentIndex:=diKey2, eError=>eError); // write build result writer(xExecute:=TRUE, pwData:=ADR(wsResult), udiSize:=SIZEOF(wsResult), xAsyncMode:=FALSE, jsonData:=pJsonData^); the result was: { "key1": ["value01"], "key2": ["value02", "value03", "value04"] } while my expection was: { "key1": ["value01", "value03"], "key2": ["value02", "value04"] } Inspecting pJsonData^, JSONData itself seems to be ok, so I believe the issue is something caused by the writer FB. Does anyone know how to fix it? Thanks,
Last updated: 2023-10-04
Post by manuknecht on Persistence Manager does not save alphabetically first value
CODESYS Forge
talk
(Post)
After some more digging I realized that I get an error on the PLC Logger saying PersistenceChannel: 150 (invalid type in data: SimpleLibrary). I suppose the issue could be found in the ConfigData, which is automatically generated and which looks like this: 1 9##83 SimpleLibrary#GVL.aMoreZeros.[1]#0#64512#15#0 <[2]#0#64520#15#0 <[3]#0#64528#15#0 <[4]#0#64536#15#0 <#0#64544#15#0 <[6]#0#64552#15#0 <<lrVar#0#64560#15#0 <strVar#0#64428#16#80 <uiDummy#0#64370#11#0 Perhaps the fact that the variable is stored within a library confused the compiler? I tried changing the PersistenceChannel parameters to xCompressTags := FALSE which changed the entry in the data file from _xCompressTags BOOL:TRUE _xCompressTags BOOL:FALSE but the actual content of the data file and also the config data did not change.
Last updated: 2023-10-17
Post by user0815 on Kommunikation zwischen ROS2 und CODESYS über Web Sockets
CODESYS Forge
talk
(Post)
Hallo zusammen, ich hoffe ihr könnt mir weiterhelfen. Meine CODESYS Version ist die V3.5 SP19 Patch 4 und die Zielsystemversion ist die 4.10.0.0 . Ich verwende CODESYS ohne Lizenz. Ich probiere eine Verbindung über Web Sockets zwischen ROS und CODESYS aufzubauen. Der Client von CODESYS verbindet sich mit dem Ros Bridge Server aber ich weiß nicht wie ich dem Ros Server sage welches Topic er publishen soll. Über Node-Red habe ich eine Verbindung aufbauen können. Dafür habe ich "node-red-contrib-flowake-ros-nodes" verwendet. Den Daten Austausch habe ich mit mit Wireshark angeschaut und nun probiere ich den mithilfe von CODESYS nachzubauen. NAch dem sich der Client verbunden hat muss folgende Nachricht übermittelt werden:"{"op":"call_service","id":"call_service:/rosapi/topic_type:1","type":"rosapi/TopicType","args":{"topic":"/cmd_vel"}}." Ich vermute es funktioniert über Frames aber ich weiß nicht wie ich es umsetzten soll. Besten Dank für die Hilfe und schöne Grüße
Last updated: 2024-01-03
Post by vipul on Multicast udp
CODESYS Forge
talk
(Post)
Hi, Good afternoon can anybody help me with UDP Multicast code. I am not able to send or recieve data when code is dumped on linux device. Below is my code. Declaration: PROGRAM udp_multicast VAR oneTimeFlag :UINT :=0; state: INT:=0; driver: UDP.UDPDriver; //port : UDP.Port;//moved to GVL src_ipAddr_ud: UDINT; src_ipAddr_st:STRING := '192.168.127.155';//'192.168.1.155';//ipms ip address dst_ipAddr_ud:UDINT; group_ipAddr_st:STRING := '239.1.5.10'; //group_ipAddr_ud:UDINT; result: SysTypes.RTS_IEC_RESULT; //result of recieve function. bind: UDINT; //result of binding. resultCreate:SysTypes.RTS_IEC_RESULT;//result of port creation. timer:BLINK; temFlag :INT:= 0; post:INT :=0; checksumFunc:checksumXor; localStringBuf:STRING[500]; chksum:BYTE; dataBuffer:POINTER TO BYTE; checksumString:ARRAY[0..5] OF BYTE; recvSize:__XINT; errorCode:UDINT; joinGroupErrorCode:UDINT; END_VAR ************8 Implementation: IF oneTimeFlag <> 1 THEN oneTimeFlag:=1; resultCreate := driver.CreatePort(ADR(GVL.port)); src_ipAddr_ud := UDP.IPSTRING_TO_UDINT(sIPAddress:= src_ipAddr_st); GVL.group_ipAddr_ud := UDP.IPSTRING_TO_UDINT(sIpAddress:= group_ipAddr_st); GVL.port.IPAddress := src_ipAddr_ud; GVl.port.ReceivePort:= GVL.src_port;//port on which messages are expected. GVl.port.SendPort := GVL.dest_port; GVl.port.OperatingSystem := 0; //0- any system GVL.port.Socket :=3; //3- socket type is multicast bind := GVL.port.Bind(udiIPAddress:=src_ipAddr_ud,); GVl.port.JoinGroup(udiGroupAddress:= GVL.group_ipAddr_ud,udiInterfaceAddress:= src_ipAddr_ud,eLogCode=>joinGroupErrorCode); END_IF timer(ENABLE:=TRUE,TIMELOW:=T#100MS,TIMEHIGH:=T#100MS); IF timer.OUT = TRUE THEN GVL.port.Send(udiIPTo:=GVL.group_ipAddr_ud,GVL.dest_port,pbyData:=ADR(GVL.writeData),diDataSize:=SIZEOF(GVL.writeData)); ELSE SysMemSet(ADR(GVL.readData[0]),0,SIZEOF(GVL.readData)); result := GVl.port.Receive(ADR(GVL.readData),diDataSize:=SIZEOF(GVL.readData),udiIPFrom=>dst_ipAddr_ud,diRecvSize=>recvSize,eLogCode=>errorCode); SysMemMove(ADR(GVL.readDataBuf[0]),ADR(GVL.readData[0]),SIZEOF(GVL.readData)); END_IF post:=LEN(GVL.readDataBuf);
Last updated: 2024-01-14
Post by alex00 on DCS / Central Engineering with Codesys support
CODESYS Forge
talk
(Post)
Hello together I'm currently investing in possibilities to have a central engineering software / system for Codesys based controllers. Something like a DCS / SCADA depending on where you see the functionality. We plan to use more or less vanilla codesys. The tool should support the following: - Connect to multiple PLC's in a project to see its variables and debug it. - Central Engineering capabilities (for example shared libraries in a project). - Download the new code / binaries to the plc. - Maybe have functionality to combine visualization elements and logic together. - See the live status variables on all the systems (crosscommunication). I see that codesys theoretically supports engineering of multiple PLC's, but I couldnt find to much functionality for a DCS type of operation, but that could be lack of knowledge. Any tips from you? Is Codesys good enough for this and maybe there are some manufacturers which build around it? Or are there good tools on the market with Codesys support (and the engineering is separate, but download to codesys possible). The use case is distributed energy installations like Heating pumps, Photovoltaics, etc. All these installations should have a PLC with codesys installed and run in one larger network, the PLC's are connected via VPN. Thanks for your inputs Greetings
Last updated: 2024-02-19
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
.