Thanks for the thoughts. Would you recommend any one of the "soft PLC" projects that I should look at further. Certainly I think the idea of a PLC emulator is too ambitious. I think the minimum effort approach, though still lots of effort, is too run the PLC code using the standard propriety tools in a VM and the to drive the input output of this VM with software to simulate the connection to hardware.
On Wed, May 4, 2022, at 11:18 AM, Łukasz Dywicki wrote: > Hey Chris, > Sorry for mixing authorship. I didn't check simulator since a while, > hence was not certain if its up to date. > > My point is about reusing network layer which PLC4X provides in order to > simulate a device. This is how you normally interact with PLC so it is a > natural way to make an "integration test" at this level. It is not > beyond typical BDD which is more about defining scenarios. How they are > actually executed depend on a BDD toolkits and how they integrate with > test or build environment. > I get that scope of Peter work is to emulate a PLC runtime, that's why I > mentioned IEC grammars (so he can somehow parse or compile entire > program), which is the hardest part. > Once program can be interpreted and executed (ie. by turning ST into > LLVM and firing graalvm or c runtime or simply running it with one of > existing tools such as openplc), the remaining part will be possible > after proper adoption of code generated from MSpec. > Looking at amount of "soft plc" projects I have no doubts that its > possible. Its just matter of how much time and simplifications we can > accept. > I agree that we don't have a capacity nor will to dive into even more > specific parts of how PLCs work. If somebody else has such interest I > will definitely look for results and see if we could improve our part > afterwards. > > Best, > Łukasz > > On 4.05.2022 09:09, Christofer Dutz wrote: >> Hi Lukasz, >> >> I intentionally didn't mention the simulator, as I understood Peter, that >> he's looking for something to run his PLC programs on for testing. Yes, the >> simulator we have could be used to simulate being a PLC, but it can't >> actually simulate the PLC itself. That's not the scope of that thing. I >> think implementing the internal stuff needed to create a simulator where you >> can deploy a program from TIA Portal is totally unthinkable, considering how >> many different PLCs are out there. >> >> Perhaps we should name it differently in order to manage expectations. >> "plc-mock"? >> >> And our simulator was actually created by me and it's up-to-date and we just >> recently checked that it still works with the StreamPipes folks, as they >> were looking for something to use in their StreamPipes integration-tests. >> >> Chris >> >> -----Original Message----- >> From: Łukasz Dywicki <l...@code-house.org> >> Sent: Dienstag, 3. Mai 2022 22:47 >> To: dev@plc4x.apache.org >> Cc: pe...@petersaxton.uk >> Subject: Re: Scope of using PLC4x as simulated driver for PLC projects >> >> Hey Peter, welcome on mailing lists. First of all thank you for showing a >> interest in a project and bringing interesting topic! >> >> Just to oppose a little bit what Chris says, I would say there is no real >> blocker for trying to do a PLC simulator within PLC4X. We do (or >> did) have a S7 simulator in sandbox already. It was built a while ago by >> Julian based on netty tcp server and I think 0.6 structures, so it might be >> a little bit behind of what we currently have in a develop branch. >> >> Technically speaking what you need in most of the cases is launching a TCP >> server (in case of ADS/Modbus/S7) or a serial receiver (Modbus RTU/till some >> degree CANopen) and answering requests which come over such communication >> channel. If you get closer to basic fieldbus like a Modbus RTU or CANopen >> difference between sending a request and answering it is not that large. >> Few remarks - we currently do not have any support beside mentioned sandbox >> project. If you decide to do such thing, it will be a far away from a >> realtime, yet TCP/UDP stuff involving IP routing by definition is not! You >> will still have to invest a ton of time in order to mimic a complete PLC >> behavior. I suppose it might be problematic to keep it up with manufacturer >> tooling, simply cause they can share some libraries or specifications unseen >> by any of us. Also a device behavior can change with firmware upgrade, so >> you have to keep a close look on that. >> If you can sacrifice realtime requirement which is often crucial to >> certification, live with above simplifications and caveats, then >> infrastructure available in PLC4X will serve you better than any other open >> source components available out there. >> >> Before we go too optimistic, a fairly common problems is how devices react >> on read/write operations. Each brand does it in an unique way, some models >> have extended functionality, plus each device report errors differently. >> There is also handling of parallel/overlapping requests which we handle >> partially even in client side. >> ADS for example has an internal notion of an routing table which is somehow >> associated with communication peer, it has support for read single and read >> multiple addresses, it has also support for subscriptions which you have to >> coordinate. If you are not afraid of it, the communication structures will >> be provided by MSpec. :) >> >> I think that this is still a major advantage of MSpec approach and code >> generation framework provided by PLC4X which awaits more use cases. >> MSpec gives us a symmetric read/write operations which we prove through >> serialization unit tests. This is unseen in most of libraries as they >> usually focus on one of the sides - either a client/master or server/slave >> structures and handle only half which is needed by them. A prime example >> could be a S7 client which does a request serialization and reply >> deserialization or S7 server which does request serialization and response >> serialization. Code generated by PLC4X handles both ways. >> Even if we miss a support for making server side framework, its something >> you can definitely do on top of what PLC4X provide. >> An interesting benefit you could get from relying on PLC4X is possibility to >> make a test of different communications for assumed simulation logic. If you >> find a way for example to write a PLC program in some portable way, then by >> mapping such program inputs and outputs to PLC specific communication >> semantics you get a very nice training suite. >> If you search for ie. ANTRL IEC 61131-3 you will find a bunch of grammar >> files allowing to parse structured text programs. From there you "just" >> need to make interpreter working with one of languages supported by PLC4X >> code generators. >> Making a partial toolkit, even for a single brand/product line, is a lot of >> work and code to be made. This code is potentially hard to maintain due to >> various firmware versions, yet nothing really blocks you from trying. Do >> your thing and report your findings if you wish. I am eager to hear your >> feedback. I believe with your work we could improve our client side >> implementations too! >> >> Cheers, >> Łukasz >> >> On 3.05.2022 13:55, Christofer Dutz wrote: >>> Hi Peter, >>> >>> well simulating a real PLC generally would totally be out of scope of >>> PLC4X. I was more referring to the code to extract the program from a PLC >>> and to deploy it somewhere (like in a simulator or in case of Codesys you >>> could run the runtime on a test-server). But there are simulators out >>> there. Usually, the PLC vendors have them. Unfortunately, they usually are >>> not for free. But I know Siemens has various simulators to which you could >>> deploy your program and then interact with PLC4X. >>> >>> Well, I guess you would need to find out how to make a software like TIA >>> portal believe your application is a S7 PLC and then need to implement the >>> parts of the protocol, that we haven't implemented yet. As S7 doesn't have >>> a public spec, you'll have to reverse engineer most of it. And another >>> problem will be that newer S7 devices use S7comm ... to convince TIA that >>> you're a real device, you would probably need to implement the S7comm >>> protocol, which opens a whole new box of worms. >>> >>> All in all, I think the industry would need such a solution, but I also >>> think they haven't realized it yet and therefore are not willing to pay the >>> money for it. >>> >>> Perhaps I'll try this concept out as part of my job, but that will probably >>> only have an effect on the types of PLCs that we use, and I have no idea, >>> if I'll get the time needed to do it. >>> >>> Chris >>> >>> >>> >>> >>> -----Original Message----- >>> From: Peter Saxton <pe...@petersaxton.uk> >>> Sent: Dienstag, 3. Mai 2022 13:30 >>> To: dev@plc4x.apache.org >>> Subject: RE: RE: Scope of using PLC4x as simulated driver for PLC >>> projects >>> >>> Hi Chris, >>> >>> Thanks for the clarification. So potentially PLC4X could drive the tests >>> but would leave the problem of simulating a PLC as outstanding. >>> One other approach I have head about is putting the PLC in a >>> completely virtual environment and then manipulating it by setting >>> values on the Virtual Machine. I don't have much information on this >>> approach just this blog post >>> https://www.plcnext-community.net/makersblog/painful-memories-of-plc-s >>> imulations/ >>> >>> You mentioned that you had though about working on something like this. >>> What would be the rough shape of your solution? Apart from industry >>> resistance what would be the hardest thing to get through in this project. >>> In my area there is a desire to embrace testing and CI probably not CD that >>> seems bold. At least the right noises are being made. We can see how it >>> plays out. >>> >>> Peter >>> >>> >>> On 2022/05/03 08:17:49 Christofer Dutz wrote: >>>> Hi Peter, >>>> >>>> Well, if you want to use PLC4X to communicate with the real or the >>>> simulated PLC in order to execute various test-scenarios: then probably >>>> PLC4X is what you're looking for. >>>> >>>> If you want to extract the PLC program from one PLC and write that to a >>>> simulator, then unfortunately PLC4X doesn't have that focus and therefore >>>> doesn't support this. >>>> >>>> The programming part of automation engineering is what every PLC vendor >>>> implements separately. Sometimes even one vendor has multiple ways of >>>> doing that for their different products. >>>> >>>> However, PLC4X does have the parts that you probably need to implement >>>> such a feature, however it will certainly require reverse engineering for >>>> almost every type of PLC. >>>> >>>> I had been thinking about starting to work on something like what you >>>> describe. However, my idea would have been to simulate just enough of a >>>> PLC for the engineering tool to accept it and to have the Engineering tool >>>> deploy the new program to that instead of a real PLC. This component would >>>> then pass the program to a CI/CD pipeline, just as you describe it. >>>> However, I knew this would be a lot of work and considering how well the >>>> industry accepted my offers in the past, I decided that I won't do this, >>>> as it's not worth it. They haven't even started thinking of concepts like >>>> continuous-integration or continuous-delivery or even testing. >>>> >>>> Chris >>>> >>>> >>>> >>>> -----Original Message----- >>>> From: Peter Saxton <pe...@petersaxton.uk> >>>> Sent: Dienstag, 3. Mai 2022 09:35 >>>> To: dev@plc4x.apache.org >>>> Subject: Scope of using PLC4x as simulated driver for PLC projects >>>> >>>> Hi everyone. >>>> >>>> First post here so apologies if my terminology is a bit off, I'm from a >>>> web software background. >>>> >>>> If I want to write behavior tests for a PLC project that already exists, >>>> is PLC4x the right tool for that job or would there be something better? >>>> >>>> Ideally I would be able to export a whole PLC project from a machine. >>>> Start that exported project in a soft/simulated PLC environment and run a >>>> suite of tests against the PLC logic. Ideally at no point would I be >>>> reliant on having the correct hardware. >>>> >>>> Reading through the PLC4x pages I found the section on "Testing (or using >>>> PLC4X without a PLC)". As I understand this this is for testing software >>>> outside the PLC but simulating a PLC. I would like to go the other way >>>> round and test a PLC project by simulating the outside world. I also >>>> looked at the section on the simulated protocol, but again I think this is >>>> for simulating values for a plc4x client. >>>> >>>> Essentially we'd like to write a test saying "when input 1 & 2 are on the >>>> output A is live", and check that the PLC code was going to do this. >>>> >>>> I'm interested in testing against Siemens PLC projects, however for >>>> getting started I would happily run a proof of concept on something like >>>> OpenPLC if that was easier without hardware. >>>> >>>> Cheers, Peter >>>>