Adapter Driver

Say we have a device named ‘foo’ and want to develop an Adapter driver for it.

Make Setup and Files

First we’ll need a new setup to do some development with -

l99 init test-foo

Then start the driver code file - from the ladder99 main folder -

touch services/adapter/src/drivers/foo.js

Then start a schema in the setup (the schema tells the driver what data to read from the device) -

mkdir -p setups/test-foo/volumes/adapter/schemas/foo
touch setups/test-foo/volumes/adapter/schemas/foo/inputs.yaml
touch setups/test-foo/volumes/adapter/schemas/foo/outputs.yaml

In the agent.xml we’ll want a dataitem for availability and some other value, so add

    <!-- Foo1 -->
    <!-- id must match that in setup.yaml -->
    <!-- name must match that in setup.yaml and agent.cfg -->
    <!-- uuid generated with uuidgen -->
    <!-- uuids MUST be unique in this file, or agent will die without error in run mode -->
    <Device id="f1" name="Foo1" uuid="e081ceaf-23cf-497c-8ab3-381dfc7c700c">
      <DataItems>
        <DataItem id="f1-avail" name="availability" category="EVENT" type="AVAILABILITY" />
        <DataItem id="f1-value1" category="SAMPLE" type="x:VALUE1" />
      </DataItems>
    </Device>

In inputs.yaml, add

inputs:
  - key: value1
    address: 0

In outputs.yaml, add

outputs:
  - key: avail
  - key: value1

The driver will read the inputs.yaml file to know what to read, will write the values to the Adapter cache, and the cache will output the value as SHDR to the Agent.

In setup.yaml, add the following, with the host value pointing to the device -

    - id: f1 # must match id in agent.xml
      name: Foo1 # this must match name in agent.cfg and agent.xml
      sources:
        - driver: foo # adapter plugin - manages protocol and payload
          schema: foo # schema defines inputs and outputs with yaml files
          connect:
            host: 10.1.10.130 # address to foo device
      outputs:
        agent:
          host: adapter # must match agent.cfg value
          port: 7910 # must match agent.cfg value

In agent.cfg, add

  Foo1 {
    Host = adapter
    Port = 7910
  }

Driver Code

For an example driver to borrow from, see services/adapter/src/drivers/modbus.js - note how it sets the ‘avail’ dataitem when it connects successfully -

          setValue('avail', 'AVAILABLE') // connected successfully

This writes ‘AVAILABLE’ to the cache at ‘f1-avail’, which then writes the output value for ‘f1-avail’ to the Agent.

Running the Pipeline

To run the pipeline,

l99 start

To watch the output,

l99 logs adapter

To restart the adapter,

l99 restart adapter

To stop the adapter,

l99 stop adapter