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.11
- Fix: IndexError when reading OneBitRequests (MB, SB...)
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.
Metadata
Release files for pcom 0.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pcom-0.11-py3-none-any.whl | Python 3 | none | any | Details |
Release files / pcom-0.11-py3-none-any.whl
| Download URL | pcom-0.11-py3-none-any.whl |
|---|---|
| Size | 20.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
33950f2d24bd305a0e69425e402edafbc3ce21643661d61b2750e6906f03df95
|
|
BLAKE2b-256 checksum How to use checksums |
f786c0c54a7108b9626486f0ca97b016bf6d178fc41d0a4402570778bb12a63e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.6.0 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.27.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.10.2
|