Ethernet/IP I/O Module

Automation Professionals is pleased to announce the public beta for its latest module in the showcase: Ethernet/IP Class 1 Communications:[quote]Provides I/O Scanning and I/O Emulation on top of partial emulation of a Logix processor (Controller Tags and User-Defined data types). Use robust, low latency UDP packets to communicate with Logix processors as one or more I/O modules (passive slave mode), and with a variety of Ethernet/IP I/O modules as an I/O scanner (active master mode). With the Controller Tag emulation, you can minimize unnecessary network traffic using Data Table messages initiated as needed by your control system, eliminating the corresponding OPC driver polling.[/quote]Please give it a spin!

Direct link to the module.
Direct link the PDF User Manual.

:thumb_left:

Much appreciated. I'm especially interested in comments / suggestions for improving the user manual. It's very dense with technical information, but I'm not sure what I could leave out or present more simply.

Already found a bug in run/program mode indication. Direct link above fixed.

I’ve been testing with a 1734-AENT Point I/O assembly with four I/O modules: IE2C, OE2V, IB4, and OB4. You can use the configuration file I’ve constructed to run them as a template for your own setup:

<Controller>
  <DataTypes>
    <DataType Name="AB:1734_DI4:C:0" Handle="1124">
      <Member Name="Pt0FilterOffOn" DataType="INT" Dimension="0" />
      <Member Name="Pt0FilterOnOff" DataType="INT" Dimension="0" />
      <Member Name="Pt1FilterOffOn" DataType="INT" Dimension="0" />
      <Member Name="Pt1FilterOnOff" DataType="INT" Dimension="0" />
      <Member Name="Pt2FilterOffOn" DataType="INT" Dimension="0" />
      <Member Name="Pt2FilterOnOff" DataType="INT" Dimension="0" />
      <Member Name="Pt3FilterOffOn" DataType="INT" Dimension="0" />
      <Member Name="Pt3FilterOnOff" DataType="INT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_DI8:I:0" Handle="2c1f">
      <Member Name="Fault" DataType="DINT" Dimension="0" />
      <Member Name="Data" DataType="SINT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_DO4_NoDiag:C:0" Handle="2e4f">
      <Member Name="FaultMode" DataType="SINT" Dimension="0" />
      <Member Name="Pt0FaultMode" DataType="BIT" Target="FaultMode" BitNumber="0" />
      <Member Name="Pt1FaultMode" DataType="BIT" Target="FaultMode" BitNumber="1" />
      <Member Name="Pt2FaultMode" DataType="BIT" Target="FaultMode" BitNumber="2" />
      <Member Name="Pt3FaultMode" DataType="BIT" Target="FaultMode" BitNumber="3" />
      <Member Name="FaultValue" DataType="SINT" Dimension="0" />
      <Member Name="Pt0FaultValue" DataType="BIT" Target="FaultValue" BitNumber="0" />
      <Member Name="Pt1FaultValue" DataType="BIT" Target="FaultValue" BitNumber="1" />
      <Member Name="Pt2FaultValue" DataType="BIT" Target="FaultValue" BitNumber="2" />
      <Member Name="Pt3FaultValue" DataType="BIT" Target="FaultValue" BitNumber="3" />
      <Member Name="ProgMode" DataType="SINT" Dimension="0" />
      <Member Name="Pt0ProgMode" DataType="BIT" Target="ProgMode" BitNumber="0" />
      <Member Name="Pt1ProgMode" DataType="BIT" Target="ProgMode" BitNumber="1" />
      <Member Name="Pt2ProgMode" DataType="BIT" Target="ProgMode" BitNumber="2" />
      <Member Name="Pt3ProgMode" DataType="BIT" Target="ProgMode" BitNumber="3" />
      <Member Name="ProgValue" DataType="SINT" Dimension="0" />
      <Member Name="Pt0ProgValue" DataType="BIT" Target="ProgValue" BitNumber="0" />
      <Member Name="Pt1ProgValue" DataType="BIT" Target="ProgValue" BitNumber="1" />
      <Member Name="Pt2ProgValue" DataType="BIT" Target="ProgValue" BitNumber="2" />
      <Member Name="Pt3ProgValue" DataType="BIT" Target="ProgValue" BitNumber="3" />
      <Member Name="Pad" DataType="DINT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_DO8:O:0" Handle="a272">
      <Member Name="Data" DataType="SINT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_DOB8:I:0" Handle="f497">
      <Member Name="Fault" DataType="DINT" Dimension="0" />
      <Member Name="Status" DataType="SINT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_IE2:C:0" Handle="1cca">
      <Member Name="Ch0LowEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch0HighEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch0DigitalFilter" DataType="INT" Dimension="0" />
      <Member Name="Ch0LAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch0HAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch0LLAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch0HHAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch0RangeType" DataType="SINT" Dimension="0" />
      <Member Name="Ch0LimitAlarmLatch" DataType="SINT" Dimension="0" />
      <Member Name="Ch0AlarmDisable" DataType="SINT" Dimension="0" />
      <Member Name="Ch1LowEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch1HighEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch1DigitalFilter" DataType="INT" Dimension="0" />
      <Member Name="Ch1LAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch1HAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch1LLAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch1HHAlarmLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch1RangeType" DataType="SINT" Dimension="0" />
      <Member Name="Ch1LimitAlarmLatch" DataType="SINT" Dimension="0" />
      <Member Name="Ch1AlarmDisable" DataType="SINT" Dimension="0" />
      <Member Name="NotchFilter" DataType="SINT" Dimension="0" />
      <Member Name="RealTimeSample" DataType="INT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_IE2:I:0" Handle="b81e">
      <Member Name="Fault" DataType="DINT" Dimension="0" />
      <Member Name="Ch0Data" DataType="INT" Dimension="0" />
      <Member Name="Ch1Data" DataType="INT" Dimension="0" />
      <Member Name="Ch0Status" DataType="SINT" Dimension="0" />
      <Member Name="Ch0Fault" DataType="BIT" Target="Ch0Status" BitNumber="0" />
      <Member Name="Ch0Calibration" DataType="BIT" Target="Ch0Status" BitNumber="1" />
      <Member Name="Ch0LAlarm" DataType="BIT" Target="Ch0Status" BitNumber="2" />
      <Member Name="Ch0HAlarm" DataType="BIT" Target="Ch0Status" BitNumber="3" />
      <Member Name="Ch0LLAlarm" DataType="BIT" Target="Ch0Status" BitNumber="4" />
      <Member Name="Ch0HHAlarm" DataType="BIT" Target="Ch0Status" BitNumber="5" />
      <Member Name="Ch0Underrange" DataType="BIT" Target="Ch0Status" BitNumber="6" />
      <Member Name="Ch0Overrange" DataType="BIT" Target="Ch0Status" BitNumber="7" />
      <Member Name="Ch1Status" DataType="SINT" Dimension="0" />
      <Member Name="Ch1Fault" DataType="BIT" Target="Ch1Status" BitNumber="0" />
      <Member Name="Ch1Calibration" DataType="BIT" Target="Ch1Status" BitNumber="1" />
      <Member Name="Ch1LAlarm" DataType="BIT" Target="Ch1Status" BitNumber="2" />
      <Member Name="Ch1HAlarm" DataType="BIT" Target="Ch1Status" BitNumber="3" />
      <Member Name="Ch1LLAlarm" DataType="BIT" Target="Ch1Status" BitNumber="4" />
      <Member Name="Ch1HHAlarm" DataType="BIT" Target="Ch1Status" BitNumber="5" />
      <Member Name="Ch1Underrange" DataType="BIT" Target="Ch1Status" BitNumber="6" />
      <Member Name="Ch1Overrange" DataType="BIT" Target="Ch1Status" BitNumber="7" />
    </DataType>
    <DataType Name="AB:1734_OE2:C:0" Handle="283b">
      <Member Name="Ch0FaultValue" DataType="INT" Dimension="0" />
      <Member Name="Ch0ProgValue" DataType="INT" Dimension="0" />
      <Member Name="Ch0LowEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch0HighEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch0LowLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch0HighLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch0RangeType" DataType="SINT" Dimension="0" />
      <Member Name="Ch0FaultMode" DataType="SINT" Dimension="0" />
      <Member Name="Ch0ProgMode" DataType="SINT" Dimension="0" />
      <Member Name="Ch0LimitAlarmLatch" DataType="SINT" Dimension="0" />
      <Member Name="Ch0AlarmDisable" DataType="SINT" Dimension="0" />
      <Member Name="Ch1FaultValue" DataType="INT" Dimension="0" />
      <Member Name="Ch1ProgValue" DataType="INT" Dimension="0" />
      <Member Name="Ch1LowEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch1HighEngineering" DataType="INT" Dimension="0" />
      <Member Name="Ch1LowLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch1HighLimit" DataType="INT" Dimension="0" />
      <Member Name="Ch1RangeType" DataType="SINT" Dimension="0" />
      <Member Name="Ch1FaultMode" DataType="SINT" Dimension="0" />
      <Member Name="Ch1ProgMode" DataType="SINT" Dimension="0" />
      <Member Name="Ch1LimitAlarmLatch" DataType="SINT" Dimension="0" />
      <Member Name="Ch1AlarmDisable" DataType="SINT" Dimension="0" />
    </DataType>
    <DataType Name="AB:1734_OE2:I:0" Handle="8d56">
      <Member Name="Fault" DataType="DINT" Dimension="0" />
      <Member Name="Ch0Status" DataType="SINT" Dimension="0" />
      <Member Name="Ch0Fault" DataType="BIT" Target="Ch0Status" BitNumber="0" />
      <Member Name="Ch0Calibration" DataType="BIT" Target="Ch0Status" BitNumber="1" />
      <Member Name="Ch0LAlarm" DataType="BIT" Target="Ch0Status" BitNumber="2" />
      <Member Name="Ch0HAlarm" DataType="BIT" Target="Ch0Status" BitNumber="3" />
      <Member Name="Ch1Status" DataType="SINT" Dimension="0" />
      <Member Name="Ch1Fault" DataType="BIT" Target="Ch1Status" BitNumber="0" />
      <Member Name="Ch1Calibration" DataType="BIT" Target="Ch1Status" BitNumber="1" />
      <Member Name="Ch1LAlarm" DataType="BIT" Target="Ch1Status" BitNumber="2" />
      <Member Name="Ch1HAlarm" DataType="BIT" Target="Ch1Status" BitNumber="3" />
    </DataType>
    <DataType Name="AB:1734_OE2:O:0" Handle="e19e">
      <Member Name="Ch0Data" DataType="INT" Dimension="0" />
      <Member Name="Ch1Data" DataType="INT" Dimension="0" />
    </DataType>
  </DataTypes>
  <Tags>
    <Tag Name="PointAI:C" DataType="AB:1734_IE2:C:0" Dimensions="0">
      <Data>
        00 00 10 27 00 00 00 80 ff 7f 00 80 ff 7f 03 00
        00 00 00 00 00 00 00 00 00 80 ff 7f 00 80 ff 7f
        03 00 00 06 00 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointAI:I" DataType="AB:1734_IE2:I:0" Dimensions="0">
      <Data>
        00 00 00 00 a6 13 00 00 00 41 00 00
      </Data>
    </Tag>
    <Tag Name="PointAO:C" DataType="AB:1734_OE2:C:0" Dimensions="0">
      <Data>
        00 00 00 00 00 00 10 27 00 80 ff 7f 01 01 01 00
        00 00 00 00 00 00 00 00 10 27 00 80 ff 7f 01 01
        01 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointAO:I" DataType="AB:1734_OE2:I:0" Dimensions="0">
      <Data>
        00 00 00 00 00 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointAO:O" DataType="AB:1734_OE2:O:0" Dimensions="0">
      <Data>
        00 00 ee 02
      </Data>
    </Tag>
    <Tag Name="PointDI:C" DataType="AB:1734_DI4:C:0" Dimensions="0">
      <Data>
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointDI:I" DataType="AB:1734_DI8:I:0" Dimensions="0">
      <Data>
        00 00 00 00 03 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointDO:C" DataType="AB:1734_DO4_NoDiag:C:0" Dimensions="0">
      <Data>
        00 00 00 00 00 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointDO:I" DataType="AB:1734_DOB8:I:0" Dimensions="0">
      <Data>
        00 00 00 00 00 00 00 00
      </Data>
    </Tag>
    <Tag Name="PointDO:O" DataType="AB:1734_DO8:O:0" Dimensions="0">
      <Data>
        0b 00 00 00
      </Data>
    </Tag>
  </Tags>
  <Assemblies>
  </Assemblies>
  <Modules>
    <Module Name="PointAI" CatalogNumber="1734-IE2C/C" Inhibited="false"
    Vendor="1" ProductType="115" ProductCode="24" Major="3" Minor="1"
    InRPI="250000" UnicastIn="true" InRTMF="0" OutRPI="250000" UnicastOut="true" OutRTMF="3">
      <EKey State="ExactMatch" />
      <Route>port 2 10.16.7.11 slot 1</Route>
      <Application>2004 247b 2cbe 2c65 800201000000</Application>
      <InputTag Size="10">PointAI:I</InputTag>
      <ConfigTag Size="38">PointAI:C</ConfigTag>
    </Module>
    <Module Name="PointAO" CatalogNumber="1734-OE2V/C" Inhibited="false"
    Vendor="1" ProductType="115" ProductCode="56" Major="3" Minor="1"
    InRPI="250000" UnicastIn="false" InRTMF="0" OutRPI="250000" UnicastOut="true" OutRTMF="4">
      <EKey State="ExactMatch" />
      <Route>port 2 10.16.7.11 slot 2</Route>
      <Application>2004 247b 2c66 2c65 800201000000</Application>
      <InputTag Size="6">PointAO:I</InputTag>
      <OutputTag>PointAO:O</OutputTag>
      <ConfigTag Size="36">PointAO:C</ConfigTag>
    </Module>
    <Module Name="PointDI" CatalogNumber="1734-IB4" Inhibited="false"
    Vendor="1" ProductType="7" ProductCode="130" Major="3" Minor="1"
    InRPI="100000" UnicastIn="false" InRTMF="0" OutRPI="100000" UnicastOut="true" OutRTMF="3">
      <EKey State="ExactMatch" />
      <Route>port 2 10.16.7.11 slot 3</Route>
      <Application>2004 2467 2cbe 2c03 800201000000</Application>
      <InputTag Size="5">PointDI:I</InputTag>
      <ConfigTag Size="20">PointDI:C</ConfigTag>
    </Module>
    <Module Name="PointDO" CatalogNumber="1734-OB4/C" Inhibited="false"
    Vendor="1" ProductType="7" ProductCode="231" Major="3" Minor="1"
    InRPI="100000" UnicastIn="false" InRTMF="0" OutRPI="100000" UnicastOut="true" OutRTMF="4">
      <EKey State="ExactMatch" />
      <Route>port 2 10.16.7.11 slot 4</Route>
      <Application>2004 247b 2c21 2c2b 800201000000</Application>
      <InputTag Size="5">PointDO:I</InputTag>
      <OutputTag Size="1">PointDO:O</OutputTag>
      <ConfigTag>PointDO:C</ConfigTag>
    </Module>
  </Modules>
</Controller>

[quote]I’m especially interested in comments / suggestions for improving the user manual. It’s very dense with technical information, but I’m not sure what I could leave out or present more simply.[/quote]Heh, this is exactly why I’m glad I don’t write documentation full time. It’s an art.

So, the user manual says that there will be future support for producer and consumer tags. I’ve started poking at that, picking up where I left off a few months ago. There were bugs then, and I had decided to focus on the ETHERNET-MODULE support and I/O scanning support. It seems that my efforts to make those work dealt with the bugs in producer tag support, as my L72 testbed for producer tags worked as soon as I turned it on. That is, any “Logix” tag defined in my module that meets the general data type requirements and size limit (500 bytes) can be consumed by a real Logix processor. (-:

Next up: consuming a tag from a Logix processor.

New version 0.9.2 is available, with Producer and Consumer tags working, and documentation updated to match. One bug that affected multiple I/O module startup has been fixed. The links above point to the updated version.

This module has been updated with my new Code Signing Certificate…

https://www.automation-pros.com/ignition/EthernetIP%20Class%201%20Communications-1.4.1.2007162048.modl

https://www.automation-pros.com/ignition/EthernetIP%20Class%201%20Communications-1.4.1.2007162037-v8.modl

2 Likes

FYI, the certificate might have expired this year in July 2022. (at least for the Ignition 8.1, v1.4.3 on the website)

Yeah, I have to resign everything. Will be switching to an independent CA, since IA doesn't actually require conventional chain-of-trust.

Note that a major upgrade of this module is now in public beta: