Skip to main content

A basic PCOM implementation in Python

Project description

PCOM

A very basic Unitronics PCOM protocol implementation for Python 3.

How to use

from pcom import commands
from pcom.plc import EthernetPlc

with EthernetPlc(address=('192.168.5.43', 1616)) as plc:
    # Read realtime clock
    c = commands.ReadRtc()
    res = plc.send(c)
    print(res)

    # Set realtime clock
    c = commands.SetRtc(value=datetime.now())
    plc.send(c)

    # Set MB 300 through 304
    values = [True, False, True, True, False]
    c = commands.SetBits(code=commands.SetBits.MEMORY, address=300, values=values)
    plc.send(c)

When entering the with block, the plc instance connects to the PLC and the connection is closed when the block is done, or when an error occurs within the block.

You can also manually call the connect() and close() methods:

from pcom import commands
from pcom.plc import EthernetPlc

plc = EthernetPlc(address=('192.168.5.43', 1616))
try:
  plc.connect()
  # Read realtime clock
  c = commands.ReadRtc()
  res = plc.send(c)
  print(res)
finally:  # Always close the connection.
  plc.close()

See the commands Python package for available commands.

Datatable commands are in the commands.datatables package. To work with a datatable, its structure has to be defined. Here's an example:

from pcom import commands
from pcom.plc import EthernetPlc


with EthernetPlc(address=('192.168.5.47', 1616)) as plc:
    table_structure = commands.datatables.DatatableStructure("My table", offset=19000, rows=2, columns=[
        commands.datatables.Int(),
        commands.datatables.Int(2),
        commands.datatables.Int(),
        commands.datatables.Int(),
        commands.datatables.Long(),
    ])
    c = commands.datatables.ReadDatatable(structure=table_structure, row_count=2)
    res = plc.send(c)
    print('My table', res)

Writing to a datatable is very much alike:

from pcom import commands
from pcom.plc import EthernetPlc


with EthernetPlc(address=('192.168.5.47', 1616)) as plc:
    table_structure = commands.datatables.DatatableStructure("My table", offset=19000, rows=2, columns=[
        commands.datatables.Int(2),
        commands.datatables.Int(),
        commands.datatables.String(5),
        commands.datatables.Int(),
        commands.datatables.Int(),
        commands.datatables.Long(),
    ])

    rows = [
        [[11, 12], [13], "hello", [14], [15], [-673542]],
        [[11, 14], [15], "bye  ", [16], [17], [655666]],
    ]
    c = commands.datatables.WriteDatatable(structure=table_structure, data=rows)
    try:
        plc.send(c)
    except datatables.WriteDatatableError as ex:
        print(ex)

Known limitations

  • General:
    • Serial communication is not implemented yet.
  • Datatables:
    • "Part of project" columns are not supported.
    • Reading a datatable structure is not supported.

Changelog

Version 0.10

  • Add hint about requested data being too large in binary command exception.
  • Fix: is_online should not be True when connect() fails.

Version 0.9.1

  • Add support for WriteIntegers and WriteFloats commands

Version 0.8

  • Start of changelog
  • BREAKING: Methods _connect() and _close() have been renamed to connect() and close(). Unless you have subclasses that overrides those methods, this has no impact.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pcom-0.10-py3-none-any.whl (20.4 kB view details)

Uploaded Python 3

File details

Details for the file pcom-0.10-py3-none-any.whl.

File metadata

  • Download URL: pcom-0.10-py3-none-any.whl
  • Upload date:
  • Size: 20.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.11.1 setuptools/41.2.0 requests-toolbelt/0.8.0 tqdm/4.25.0 CPython/2.7.18

File hashes

Hashes for pcom-0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 9b7f265c193abe52511e01c24fc4b4368bbd4cb5e066e9d76e046ae55fff4600
MD5 52a0c9715dfa025dc8d6303df8cca0f5
BLAKE2b-256 9b80bb7b0dbed1eebf4381849571b0b58ae5eaff5096a20127c97f6804be202f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page