I strongly recommend to anyone asking about EtherCAT or Beckhoff IO to use either the BK9000 or EK9000 coupler. SLAC has used BK9000 couplers and the KL**** terminals extensively for slow EPICS IO at LCLS and elsewhere.
We have also deployed EL**** and EP**** (EtherCAT) terminals using the Diamond EtherCAT IOC and EtherLab master. This solution is good, with the drawback of requiring kernel modules and a bit more overhead than a basic EPICS IOC. However, there is another way to use the EtherCAT (EL) terminals from Beckhoff.
The EK9000 creates a Modbus interface for the EL terminals similar to how the BK9000 creates one for the KL terminals. Unfortunately it's not exactly the same so we have to write new device support. I am happy to report it's in progress right now!
We have a talented intern assigned to work on EK9000 support using Mark River's Modbus module, R3-0. He's making good progress, we should be ready for a hardware demo this week.
If you have any questions about the development, please feel free to send me an email.
From: email@example.com <firstname.lastname@example.org> On Behalf Of email@example.com
Sent: Sunday, June 30, 2019 10:00 AM
Subject: Tech-talk Digest, Vol 13, Issue 281
Send Tech-talk mailing list submissions to
To subscribe or unsubscribe via the World Wide Web, visit
or, via email, send a message with subject or body 'help' to
You can reach the person managing the list at
When replying, please edit your Subject line so it is more specific than "Re: Contents of Tech-talk digest..."
1. Re: [EXTERNAL] Beckhoff BK9000 support survey (Jeong Han Lee)
Date: Sun, 30 Jun 2019 10:26:26 -0400
From: Jeong Han Lee <firstname.lastname@example.org>
To: "Dunning, Michael" <email@example.com>,
Subject: Re: [EXTERNAL] Beckhoff BK9000 support survey
Content-Type: text/plain; charset="utf-8"; Format="flowed"
ESS has a bit unique and generic EPICS support based on asyn. Please look at the following talk
We've called it as ecmc (EtherCat Motion Control), but we extend it to generic I/O supports. The current support modules in the enclosed file.
Unfortunately, they are within the closed repository, but we are willing to share it within EPICS community.
On 6/27/19 5:38 PM, Dunning, Michael via Tech-talk wrote:
> Thanks everybody for the responses so far.
> I should add that, as Davide mentioned, for some modules we need to
> access the Beckhoff "hidden" registers which can only be accessed
> through other registers. This makes the modbus "driver" approach
> necessary if we want to cover all modules. In our case we've needed
> to access these registers for changing configuration parameters, e.g.
> changing thermocouple types or ADC scaling, or for motor
> Mark - thanks for pointing out the new C++ version of modbus. It
> sounds like we could get rid of our custom modbus driver code and
> instead call modbus functions directly from our asynPortDriver. This
> should simplify things and make maintenance a bit easier. This
> definitely sounds like something we should pursue.
> Thanks again to all who have responded.
> Michael Dunning
> SLAC National Accelerator Laboratory
> 2575 Sand Hill Road
> Menlo Park, CA 94025
> (650) 926-5200
> On Thu, Jun 27, 2019 at 11:52 AM Mark Rivers <firstname.lastname@example.org> wrote:
>>> I would only do this if the application is complex enough that you
>>> need to move logic from the database down into C++ code. I'd still
>>> make use of the standard modbus support module and use it like a
>>> library to handle the modbus protocol (since it's been around for
>>> 10+ years and is well tested, that would be my starting point
>> In the new asynPortDriver branch you can do the following:
>> asynSetOption("Koyo1", 0, "disconnectOnReadTimeout", "Y");
>> modbusInterposeConfig("Koyo1", modbusLinkTCP, 5000, 0);
>> // Use absolute addressing, modbusStartAddress=-1.
>> drvModbusAsyn *pModbus = new drvModbusAsyn("K1", "Koyo1", 0,
>> 2, -1, 256, dataTypeUInt16, 0, "Koyo");
>> // Write 10 bits at address 2048
>> memset(data, 0, sizeof(data));
>> data = 1;
>> data = 1;
>> data = 1;
>> data = 1;
>> data = 1;
>> printf(" Writing [1 0 1 0 1 0 1 0 1 0] to adddress 2048\n");
>> /* asynStatus doModbusIO(int slave, int function, int start, epicsUInt16 *data, int len); */
>> pModbus->doModbusIO(0, MODBUS_WRITE_MULTIPLE_COILS, 2048,
>> data, 10);
>> Because the drvModbusAsyn constructor was called with startAddress=-1 doModbusIO can write to any address with any function code.
>> Sent from my iPhone
>> On Jun 27, 2019, at 12:23 PM, Pearson, Matthew R. via Tech-talk <email@example.com<mailto:firstname.lastname@example.org>> wrote:
>> One version uses only the epics modbus module. This has no driver so
>> requires less maintenance, but makes setting up IOCs more time
>> consuming and results in a lot of code duplication.
>> If the only problem with this method is the code duplication in each IOC then it's best to move the database into templates in a support module. Then all the IOC has to do is include them in a substitutions file. You could have one template per module type. And if there is common database code between modules then separate that out into common template files that are included in the per-module templates.
>> Then in the IOC startup script you may have a large list of calls to drvModbusAsynConfigure in order to setup the modbus ports for different address ranges. You can also put this in the support module, and just include it in the IOC st.cmd, passing in macros as necessary. For example, this is what I do for one of my applications for the Moxa ioLogik modules:
>> #E1214 Unit (6 DI and 6 Relay)
>> < $(MOXA)/st_scripts/st_common.cmd
>> Where st_common.cmd is just a list of calls to drvModbusAsynConfigure. You may or may not need a different list for each type of module, depending on the modbus registry maps.
>> Another version uses asynPortDriver and some custom modbus code.
>> This is designed to make setting up IOCs easier, but requires
>> maintenance of the driver code.
>> I would only do this if the application is complex enough that you need to move logic from the database down into C++ code. I'd still make use of the standard modbus support module and use it like a library to handle the modbus protocol (since it's been around for 10+ years and is well tested, that would be my starting point).
>> Another uses custom epics device support. This requires writing
>> device support for each bus terminal, and has resulted in a pretty
>> ugly codebase. This is our least favored solution going forward.
>> There's no need to write support this way anymore, since Asyn gives you the device support for free.
-------------- next part --------------
Tech-talk mailing list Techemail@example.com https://mailman.aps.anl.gov/mailman/listinfo/tech-talk
End of Tech-talk Digest, Vol 13, Issue 281
- RE: [EXTERNAL] Beckhoff BK9000 support survey GAGET Alexis via Tech-talk
- Navigate by Date:
Re: [EXTERNAL] Beckhoff BK9000 support survey Jeong Han Lee via Tech-talk
Re: epics performance test tools or results Johnson, Andrew N. via Tech-talk
- Navigate by Thread:
EPICS Documentathon Timo Korhonen via Tech-talk
RE: [EXTERNAL] Beckhoff BK9000 support survey GAGET Alexis via Tech-talk