Cодержит классы SdgDevMaster и SdgDevAsync для обмена командами, через СКБ-шный интерфейс ввода/вывода. https://pypi.org/project/sdg-io/
SdgDevMaster умеет только передавать команды, т.е. выполняет работу Главного устройства.
SdgDevAsync предназначен как для передачи так и для приема команд, т.е позволяет
организовать работу как Главного так и Подчиненного устройства.
Для работы SdgDevAsync создается поток, в котором выполняется переодическое
чтение данных из интерфейса ввода/вывода и их обработка на предмет получения команд.
Входящие команды должны быть заранее добавлены методом add_incmd() с указанием кода команды,
форматом ожидаемых данных и callback функции, которой будет передано управление при
поступлении команды с нужным кодом и форматом данных.
Внимание callback функция вызывается из внутреннего потока SdgDevAsync и не должна его
блокировать! Для безопасного обмена данными должны быть приняты меры!
SdgDevMaster и SdgDevAsync могут автоматически определять порт к которому подключено
подчиненное устройство. Для этого нужно:
- Переопределить функцию
check_id(), которая будет запрашиватьуникальный идентификаторуподчиненногои при получении адекватного ответа, возвращать True. - Использовать ф-ю
search_port()для поискаподчиненногопо всем доступным портам системы, или search_port(portlist) для поиска по заранее подготовленному списоку портов.
При необходимости подключить какой-то другой интерфейс ввода/вывода нужно
использовать классы DevMaster и DevAsync.
Интерфейс ввода/вывода должен иметь методы read/write и вызывать
исключение IOError при ошибках чтения/записи.
Формат обмена:
АА СС D0 D1 .. DX - команда
AA CA D0 D1 .. DX - ответ
АА: адрес устройства. Возможна работа без адреса (точка -точка).СС: код команды, любой в диапазоне 0x00 - 0x7F, кроме 0x70CA: код ответа = код команды с установленным старшим битом 0x80 - 0xFF, кроме 0xF0D0-DX: данные команды/ответа опционально. На широковещательные команды с адресомАА=0х00ответ подчиненным(и) не выдается. Возможен ответ подчиненного с кодом0xF0Недопустимая командаэто означает, что он не смог выполнить данныую команду. Формат такого ответа:AA 0xF0 CC EE, гдеEE- код ошибки выполнения. (см. class DevBadCode)
Пример использования (example.py):
from struct import pack
from sdg_utils import log_open
from sdg_dev import SdgDevMaster, DevException, SdgDevAsync
log = log_open()
class MyMaster(SdgDevMaster):
def __init__(self):
super().__init__(port='', log=log.getChild('mastr'))
def check_id(self):
return self.send(b'\x00', ackfrmt='H') == 0xAAAA
def send_val(self, val):
return self.send(b'\x31' + pack('I', val), ackfrmt='')
def request_val(self):
return self.send(b'\x32', ackfrmt='I', timeout=.1, remix=0)
class MySlave(SdgDevAsync):
def __init__(self, port):
super().__init__(port, log=log.getChild('slave'))
self.val = 0x04030201
self.ID = 0xAAAA
self.add_incmd(b'\x00', '', self._getid)
self.add_incmd(b'\x31', 'I', self._setval)
self.add_incmd(b'\x32', '', self._getval)
self.add_incmd(b'\x33', '', lambda: pack('BBBB', 5, 6, 7, 8))
def _setval(self, val):
self.val = val
return b''
def _getval(self):
return pack('I', self.val)
def _getid(self):
return pack('H', self.ID)
if __name__ == "__main__":
print('Порт для master-a будет определен автопоиском по всем доступным портам системы.')
PORT = input("Ведите название порта для slave-a или нажмите Enter(по умочанию 'COM26'):")
if not PORT:
PORT = 'COM26'
slave = MySlave(PORT)
master = MyMaster()
master.search_port()
try:
val = master.request_val()
log.info(f"request_val 0x{val:08x}")
log.info(f"send new val 0x01020304")
master.send_val(0x01020304)
val = master.request_val()
log.info(f"request_val 0x{val:08x}")
a, b, c, d = master.send(b'\x33', ackfrmt='BBBB')
log.info(f"{a}, {b}, {c}, {d}")
except DevException as e:
log.error(e)
master.close()
slave.close()
Metadata
Release files for sdg-dev 2.7
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 | Actions Reset |
|---|---|---|---|---|
| sdg_dev-2.7-py3-none-any.whl | Python 3 | none | any | Details for sdg_dev-2.7-py3-none-any.whl |
Release files / sdg_dev-2.7-py3-none-any.whl
| Download URL | sdg_dev-2.7-py3-none-any.whl |
|---|---|
| Size | 40.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b6ff560443f4780ad5fcc3b7b78c867cb5f26c1321e71d770f251f8a6630e404
|
|
BLAKE2b-256 checksum How to use checksums |
b444c7f4235f24139c7361244da06b06a90504b31d38cb9d93a6d76460cb9a0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.10.5
|
Security for sdg-dev 2.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.