hat.drivers.mms
Manufacturing Message Specification
1"""Manufacturing Message Specification""" 2 3from hat.drivers.mms.connection import ( 4 ConnectionCb, 5 RequestCb, 6 UnconfirmedCb, 7 connect, 8 listen, 9 Server, 10 Connection) 11 12from hat.drivers.mms.common import ( 13 DataAccessError, 14 ObjectClass, 15 AaSpecificObjectName, 16 DomainSpecificObjectName, 17 VmdSpecificObjectName, 18 ObjectName, 19 AaSpecificObjectScope, 20 DomainSpecificObjectScope, 21 VmdSpecificObjectScope, 22 ObjectScope, 23 ArrayData, 24 BcdData, 25 BinaryTimeData, 26 BitStringData, 27 BooleanData, 28 BooleanArrayData, 29 FloatingPointData, 30 GeneralizedTimeData, 31 IntegerData, 32 MmsStringData, 33 ObjIdData, 34 OctetStringData, 35 StructureData, 36 UnsignedData, 37 UtcTimeData, 38 VisibleStringData, 39 Data, 40 ArrayTypeDescription, 41 BcdTypeDescription, 42 BinaryTimeTypeDescription, 43 BitStringTypeDescription, 44 BooleanTypeDescription, 45 FloatingPointTypeDescription, 46 GeneralizedTimeTypeDescription, 47 IntegerTypeDescription, 48 MmsStringTypeDescription, 49 ObjIdTypeDescription, 50 OctetStringTypeDescription, 51 StructureTypeDescription, 52 UnsignedTypeDescription, 53 UtcTimeTypeDescription, 54 VisibleStringTypeDescription, 55 TypeDescription, 56 AddressVariableSpecification, 57 InvalidatedVariableSpecification, 58 NameVariableSpecification, 59 ScatteredAccessDescriptionVariableSpecification, 60 VariableDescriptionVariableSpecification, 61 VariableSpecification, 62 StatusRequest, 63 GetNameListRequest, 64 IdentifyRequest, 65 GetVariableAccessAttributesRequest, 66 GetNamedVariableListAttributesRequest, 67 ReadRequest, 68 WriteRequest, 69 DefineNamedVariableListRequest, 70 DeleteNamedVariableListRequest, 71 Request, 72 StatusResponse, 73 GetNameListResponse, 74 IdentifyResponse, 75 GetVariableAccessAttributesResponse, 76 GetNamedVariableListAttributesResponse, 77 ReadResponse, 78 WriteResponse, 79 DefineNamedVariableListResponse, 80 DeleteNamedVariableListResponse, 81 Response, 82 VmdStateError, 83 ApplicationReferenceError, 84 DefinitionError, 85 ResourceError, 86 ServiceError, 87 ServicePreemptError, 88 TimeResolutionError, 89 AccessError, 90 InitiateError, 91 ConcludeError, 92 CancelError, 93 FileError, 94 OtherError, 95 Error, 96 EventNotificationUnconfirmed, 97 InformationReportUnconfirmed, 98 UnsolicitedStatusUnconfirmed, 99 Unconfirmed) 100 101 102__all__ = [ 103 'ConnectionCb', 104 'RequestCb', 105 'UnconfirmedCb', 106 'connect', 107 'listen', 108 'Server', 109 'Connection', 110 'DataAccessError', 111 'ObjectClass', 112 'AaSpecificObjectName', 113 'DomainSpecificObjectName', 114 'VmdSpecificObjectName', 115 'ObjectName', 116 'AaSpecificObjectScope', 117 'DomainSpecificObjectScope', 118 'VmdSpecificObjectScope', 119 'ObjectScope', 120 'ArrayData', 121 'BcdData', 122 'BinaryTimeData', 123 'BitStringData', 124 'BooleanData', 125 'BooleanArrayData', 126 'FloatingPointData', 127 'GeneralizedTimeData', 128 'IntegerData', 129 'MmsStringData', 130 'ObjIdData', 131 'OctetStringData', 132 'StructureData', 133 'UnsignedData', 134 'UtcTimeData', 135 'VisibleStringData', 136 'Data', 137 'ArrayTypeDescription', 138 'BcdTypeDescription', 139 'BinaryTimeTypeDescription', 140 'BitStringTypeDescription', 141 'BooleanTypeDescription', 142 'FloatingPointTypeDescription', 143 'GeneralizedTimeTypeDescription', 144 'IntegerTypeDescription', 145 'MmsStringTypeDescription', 146 'ObjIdTypeDescription', 147 'OctetStringTypeDescription', 148 'StructureTypeDescription', 149 'UnsignedTypeDescription', 150 'UtcTimeTypeDescription', 151 'VisibleStringTypeDescription', 152 'TypeDescription', 153 'AddressVariableSpecification', 154 'InvalidatedVariableSpecification', 155 'NameVariableSpecification', 156 'ScatteredAccessDescriptionVariableSpecification', 157 'VariableDescriptionVariableSpecification', 158 'VariableSpecification', 159 'StatusRequest', 160 'GetNameListRequest', 161 'IdentifyRequest', 162 'GetVariableAccessAttributesRequest', 163 'GetNamedVariableListAttributesRequest', 164 'ReadRequest', 165 'WriteRequest', 166 'DefineNamedVariableListRequest', 167 'DeleteNamedVariableListRequest', 168 'Request', 169 'StatusResponse', 170 'GetNameListResponse', 171 'IdentifyResponse', 172 'GetVariableAccessAttributesResponse', 173 'GetNamedVariableListAttributesResponse', 174 'ReadResponse', 175 'WriteResponse', 176 'DefineNamedVariableListResponse', 177 'DeleteNamedVariableListResponse', 178 'Response', 179 'VmdStateError', 180 'ApplicationReferenceError', 181 'DefinitionError', 182 'ResourceError', 183 'ServiceError', 184 'ServicePreemptError', 185 'TimeResolutionError', 186 'AccessError', 187 'InitiateError', 188 'ConcludeError', 189 'CancelError', 190 'FileError', 191 'OtherError', 192 'Error', 193 'EventNotificationUnconfirmed', 194 'InformationReportUnconfirmed', 195 'UnsolicitedStatusUnconfirmed', 196 'Unconfirmed']
72async def connect(addr: tcp.Address, 73 local_detail_calling: int | None = None, 74 request_cb: RequestCb | None = None, 75 unconfirmed_cb: UnconfirmedCb | None = None, 76 **kwargs 77 ) -> 'Connection': 78 """Connect to MMS server 79 80 Additional arguments are passed directly to `hat.drivers.acse.connect` 81 (`syntax_name_list`, `app_context_name` and `user_data` are set by 82 this coroutine). 83 84 """ 85 initiate_req = 'initiate-RequestPDU', { 86 'proposedMaxServOutstandingCalling': 5, 87 'proposedMaxServOutstandingCalled': 5, 88 'initRequestDetail': { 89 'proposedVersionNumber': 1, 90 'proposedParameterCBB': _parameter_cbb, 91 'servicesSupportedCalling': _service_support}} 92 93 if local_detail_calling is not None: 94 initiate_req[1]['localDetailCalling'] = local_detail_calling 95 96 req_user_data = _encode(initiate_req) 97 conn = await acse.connect(addr=addr, 98 syntax_name_list=[_mms_syntax_name], 99 app_context_name=_mms_app_context_name, 100 user_data=(_mms_syntax_name, req_user_data), 101 **kwargs) 102 103 try: 104 res_syntax_name, res_user_data = conn.conn_res_user_data 105 if res_syntax_name != _mms_syntax_name: 106 raise Exception("invalid syntax name") 107 108 initiate_res = _decode(res_user_data) 109 if initiate_res[0] != 'initiate-ResponsePDU': 110 raise Exception("invalid initiate response") 111 112 return Connection(conn=conn, 113 request_cb=request_cb, 114 unconfirmed_cb=unconfirmed_cb) 115 116 except Exception: 117 await aio.uncancellable(conn.async_close()) 118 raise
Connect to MMS server
Additional arguments are passed directly to hat.drivers.acse.connect
(syntax_name_list
, app_context_name
and user_data
are set by
this coroutine).
121async def listen(connection_cb: ConnectionCb, 122 addr: tcp.Address = tcp.Address('0.0.0.0', 102), 123 request_cb: RequestCb | None = None, 124 unconfirmed_cb: UnconfirmedCb | None = None, 125 *, 126 bind_connections: bool = False, 127 **kwargs 128 ) -> 'Server': 129 """Create MMS listening server 130 131 Additional arguments are passed directly to `hat.drivers.acse.listen`. 132 133 Args: 134 connection_cb: new connection callback 135 request_cb: received request callback 136 addr: local listening address 137 138 """ 139 server = Server() 140 server._connection_cb = connection_cb 141 server._request_cb = request_cb 142 server._unconfirmed_cb = unconfirmed_cb 143 server._bind_connections = bind_connections 144 145 server._srv = await acse.listen(validate_cb=server._on_validate, 146 connection_cb=server._on_connection, 147 addr=addr, 148 bind_connections=False, 149 **kwargs) 150 151 return server
Create MMS listening server
Additional arguments are passed directly to hat.drivers.acse.listen
.
Arguments:
- connection_cb: new connection callback
- request_cb: received request callback
- addr: local listening address
154class Server(aio.Resource): 155 """MMS listening server 156 157 For creating new server see `listen`. 158 159 """ 160 161 @property 162 def async_group(self) -> aio.Group: 163 """Async group""" 164 return self._srv.async_group 165 166 @property 167 def addresses(self) -> list[tcp.Address]: 168 """Listening addresses""" 169 return self._srv.addresses 170 171 async def _on_validate(self, syntax_names, user_data): 172 syntax_name, req_user_data = user_data 173 if syntax_name != _mms_syntax_name: 174 raise Exception('invalid mms syntax name') 175 176 initiate_req = _decode(req_user_data) 177 if initiate_req[0] != 'initiate-RequestPDU': 178 raise Exception('invalid initiate request') 179 180 initiate_res = 'initiate-ResponsePDU', { 181 'negotiatedMaxServOutstandingCalling': 5, 182 'negotiatedMaxServOutstandingCalled': 5, 183 'negotiatedDataStructureNestingLevel': 4, # TODO compatibility 184 'initResponseDetail': { 185 'negotiatedVersionNumber': 1, 186 'negotiatedParameterCBB': _parameter_cbb, 187 'servicesSupportedCalled': _service_support}} 188 if 'localDetailCalling' in initiate_req[1]: 189 initiate_res[1]['localDetailCalled'] = \ 190 initiate_req[1]['localDetailCalling'] 191 192 res_user_data = _encode(initiate_res) 193 return _mms_syntax_name, res_user_data 194 195 async def _on_connection(self, acse_conn): 196 try: 197 try: 198 conn = Connection(conn=acse_conn, 199 request_cb=self._request_cb, 200 unconfirmed_cb=self._unconfirmed_cb) 201 202 except Exception: 203 await aio.uncancellable(acse_conn.async_close()) 204 raise 205 206 try: 207 await aio.call(self._connection_cb, conn) 208 209 except BaseException: 210 await aio.uncancellable(conn.async_close()) 211 raise 212 213 except Exception as e: 214 mlog.error("error creating new incomming connection: %s", 215 e, exc_info=e) 216 return 217 218 if not self._bind_connections: 219 return 220 221 try: 222 await conn.wait_closed() 223 224 except BaseException: 225 await aio.uncancellable(conn.async_close()) 226 raise
MMS listening server
For creating new server see listen
.
161 @property 162 def async_group(self) -> aio.Group: 163 """Async group""" 164 return self._srv.async_group
Async group
166 @property 167 def addresses(self) -> list[tcp.Address]: 168 """Listening addresses""" 169 return self._srv.addresses
Listening addresses
229class Connection(aio.Resource): 230 """MMS connection 231 232 For creating new connection see `connect` or `listen`. 233 234 """ 235 236 def __init__(self, 237 conn: acse.Connection, 238 request_cb: RequestCb, 239 unconfirmed_cb: UnconfirmedCb): 240 self._conn = conn 241 self._request_cb = request_cb 242 self._unconfirmed_cb = unconfirmed_cb 243 self._loop = asyncio.get_running_loop() 244 self._next_invoke_ids = itertools.count(0) 245 self._response_futures = {} 246 self._close_pdu = 'conclude-RequestPDU', None 247 self._async_group = aio.Group() 248 249 self.async_group.spawn(aio.call_on_cancel, self._on_close) 250 self.async_group.spawn(self._receive_loop) 251 self.async_group.spawn(aio.call_on_done, conn.wait_closing(), 252 self.close) 253 254 @property 255 def async_group(self) -> aio.Group: 256 """Async group""" 257 return self._async_group 258 259 @property 260 def info(self) -> acse.ConnectionInfo: 261 """Connection info""" 262 return self._conn.info 263 264 async def send_unconfirmed(self, unconfirmed: common.Unconfirmed): 265 """Send unconfirmed message""" 266 if not self.is_open: 267 raise ConnectionError() 268 269 pdu = 'unconfirmed-PDU', { 270 'service': encoder.encode_unconfirmed(unconfirmed)} 271 data = _mms_syntax_name, _encode(pdu) 272 await self._conn.send(data) 273 274 async def send_confirmed(self, 275 req: common.Request 276 ) -> common.Response | common.Error: 277 """Send confirmed request and wait for response""" 278 if not self.is_open: 279 raise ConnectionError() 280 281 invoke_id = next(self._next_invoke_ids) 282 pdu = 'confirmed-RequestPDU', { 283 'invokeID': invoke_id, 284 'service': encoder.encode_request(req)} 285 data = _mms_syntax_name, _encode(pdu) 286 await self._conn.send(data) 287 288 if not self.is_open: 289 raise ConnectionError() 290 291 try: 292 future = self._loop.create_future() 293 self._response_futures[invoke_id] = future 294 return await future 295 296 finally: 297 self._response_futures.pop(invoke_id, None) 298 299 async def _on_close(self): 300 if self._conn.is_open: 301 try: 302 data = _mms_syntax_name, _encode(self._close_pdu) 303 await self._conn.send(data) 304 await self._conn.drain() 305 306 # TODO: wait for response in case of conclude-RequestPDU 307 308 except Exception as e: 309 mlog.error("on close error: %s", e, exc_info=e) 310 311 await self._conn.async_close() 312 313 async def _receive_loop(self): 314 try: 315 while True: 316 syntax_name, entity = await self._conn.receive() 317 if syntax_name != _mms_syntax_name: 318 continue 319 320 pdu = _decode(entity) 321 name, data = pdu 322 323 if name == 'unconfirmed-PDU': 324 await self._process_unconfirmed(data) 325 326 elif name == 'confirmed-RequestPDU': 327 await self._process_request(data) 328 329 elif name == 'confirmed-ResponsePDU': 330 await self._process_response(data) 331 332 elif name == 'confirmed-ErrorPDU': 333 await self._process_error(data) 334 335 elif name == 'conclude-RequestPDU': 336 self._close_pdu = 'conclude-ResponsePDU', None 337 break 338 339 else: 340 raise Exception('unsupported pdu') 341 342 except ConnectionError: 343 pass 344 345 except Exception as e: 346 mlog.error("receive loop error: %s", e, exc_info=e) 347 348 finally: 349 self.close() 350 351 for response_future in self._response_futures.values(): 352 if not response_future.done(): 353 response_future.set_exception(ConnectionError()) 354 355 async def _process_unconfirmed(self, data): 356 unconfirmed = encoder.decode_unconfirmed(data['service']) 357 358 if self._unconfirmed_cb is None: 359 raise Exception('unconfirmed_cb not defined') 360 361 await aio.call(self._unconfirmed_cb, self, unconfirmed) 362 363 async def _process_request(self, data): 364 invoke_id = data['invokeID'] 365 req = encoder.decode_request(data['service']) 366 367 if self._request_cb is None: 368 raise Exception('request_cb not defined') 369 370 res = await aio.call(self._request_cb, self, req) 371 372 if isinstance(res, common.Response): 373 res_pdu = 'confirmed-ResponsePDU', { 374 'invokeID': invoke_id, 375 'service': encoder.encode_response(res)} 376 377 elif isinstance(res, common.Error): 378 res_pdu = 'confirmed-ErrorPDU', { 379 'invokeID': invoke_id, 380 'serviceError': encoder.encode_error(res)} 381 382 else: 383 TypeError('unsupported response/error type') 384 385 res_data = _mms_syntax_name, _encode(res_pdu) 386 await self._conn.send(res_data) 387 388 async def _process_response(self, data): 389 invoke_id = data['invokeID'] 390 res = encoder.decode_response(data['service']) 391 392 future = self._response_futures.get(invoke_id) 393 if not future or future.done(): 394 mlog.warning("dropping confirmed response (invoke_id: %s)", 395 invoke_id) 396 return 397 398 future.set_result(res) 399 400 async def _process_error(self, data): 401 invoke_id = data['invokeID'] 402 error = encoder.decode_error(data['serviceError']) 403 404 future = self._response_futures.get(invoke_id) 405 if not future or future.done(): 406 mlog.warning("dropping confirmed error (invoke_id: %s)", invoke_id) 407 return 408 409 future.set_result(error)
236 def __init__(self, 237 conn: acse.Connection, 238 request_cb: RequestCb, 239 unconfirmed_cb: UnconfirmedCb): 240 self._conn = conn 241 self._request_cb = request_cb 242 self._unconfirmed_cb = unconfirmed_cb 243 self._loop = asyncio.get_running_loop() 244 self._next_invoke_ids = itertools.count(0) 245 self._response_futures = {} 246 self._close_pdu = 'conclude-RequestPDU', None 247 self._async_group = aio.Group() 248 249 self.async_group.spawn(aio.call_on_cancel, self._on_close) 250 self.async_group.spawn(self._receive_loop) 251 self.async_group.spawn(aio.call_on_done, conn.wait_closing(), 252 self.close)
254 @property 255 def async_group(self) -> aio.Group: 256 """Async group""" 257 return self._async_group
Async group
259 @property 260 def info(self) -> acse.ConnectionInfo: 261 """Connection info""" 262 return self._conn.info
Connection info
264 async def send_unconfirmed(self, unconfirmed: common.Unconfirmed): 265 """Send unconfirmed message""" 266 if not self.is_open: 267 raise ConnectionError() 268 269 pdu = 'unconfirmed-PDU', { 270 'service': encoder.encode_unconfirmed(unconfirmed)} 271 data = _mms_syntax_name, _encode(pdu) 272 await self._conn.send(data)
Send unconfirmed message
274 async def send_confirmed(self, 275 req: common.Request 276 ) -> common.Response | common.Error: 277 """Send confirmed request and wait for response""" 278 if not self.is_open: 279 raise ConnectionError() 280 281 invoke_id = next(self._next_invoke_ids) 282 pdu = 'confirmed-RequestPDU', { 283 'invokeID': invoke_id, 284 'service': encoder.encode_request(req)} 285 data = _mms_syntax_name, _encode(pdu) 286 await self._conn.send(data) 287 288 if not self.is_open: 289 raise ConnectionError() 290 291 try: 292 future = self._loop.create_future() 293 self._response_futures[invoke_id] = future 294 return await future 295 296 finally: 297 self._response_futures.pop(invoke_id, None)
Send confirmed request and wait for response
11class DataAccessError(enum.Enum): 12 OBJECT_INVALIDATED = 0 13 HARDWARE_FAULT = 1 14 TEMPORARILY_UNAVAILABLE = 2 15 OBJECT_ACCESS_DENIED = 3 16 OBJECT_UNDEFINED = 4 17 INVALID_ADDRESS = 5 18 TYPE_UNSUPPORTED = 6 19 TYPE_INCONSISTENT = 7 20 OBJECT_ATTRIBUTE_INCONSISTENT = 8 21 OBJECT_ACCESS_UNSUPPORTED = 9 22 OBJECT_NON_EXISTENT = 10 23 OBJECT_VALUE_INVALID = 11
26class ObjectClass(enum.Enum): 27 NAMED_VARIABLE = 0 28 NAMED_VARIABLE_LIST = 2 29 JOURNAL = 8 30 DOMAIN = 9 31 UNDEFINED = 0xFF
AaSpecificObjectName(identifier,)
DomainSpecificObjectName(domain_id, item_id)
VmdSpecificObjectName(identifier,)
AaSpecificObjectScope()
DomainSpecificObjectScope(identifier,)
VmdSpecificObjectScope()
ArrayData(elements,)
Alias for field number 0
BcdData(value,)
BinaryTimeData(value,)
BitStringData(value,)
BooleanData(value,)
BooleanArrayData(value,)
FloatingPointData(value,)
GeneralizedTimeData(value,)
IntegerData(value,)
MmsStringData(value,)
ObjIdData(value,)
OctetStringData(value,)
StructureData(elements,)
Alias for field number 0
UnsignedData(value,)
131class UtcTimeData(typing.NamedTuple): 132 value: datetime.datetime 133 leap_second: bool 134 clock_failure: bool 135 not_synchronized: bool 136 accuracy: int | None 137 """accurate fraction bits [0,24]"""
UtcTimeData(value, leap_second, clock_failure, not_synchronized, accuracy)
VisibleStringData(value,)
164class ArrayTypeDescription(typing.NamedTuple): 165 number_of_elements: int 166 element_type: typing.Union['TypeDescription', ObjectName]
ArrayTypeDescription(number_of_elements, element_type)
Create new instance of ArrayTypeDescription(number_of_elements, element_type)
Alias for field number 1
BcdTypeDescription(xyz,)
BinaryTimeTypeDescription(xyz,)
BitStringTypeDescription(xyz,)
BooleanTypeDescription()
185class FloatingPointTypeDescription(typing.NamedTuple): 186 format_width: int 187 exponent_width: int
FloatingPointTypeDescription(format_width, exponent_width)
GeneralizedTimeTypeDescription()
IntegerTypeDescription(xyz,)
MmsStringTypeDescription(xyz,)
ObjIdTypeDescription()
OctetStringTypeDescription(xyz,)
210class StructureTypeDescription(typing.NamedTuple): 211 components: Collection[tuple[str | None, 212 typing.Union['TypeDescription', ObjectName]]]
StructureTypeDescription(components,)
Create new instance of StructureTypeDescription(components,)
Alias for field number 0
UnsignedTypeDescription(xyz,)
UtcTimeTypeDescription()
VisibleStringTypeDescription(xyz,)
AddressVariableSpecification(address,)
InvalidatedVariableSpecification()
NameVariableSpecification(name,)
Create new instance of NameVariableSpecification(name,)
258class ScatteredAccessDescriptionVariableSpecification(typing.NamedTuple): 259 specifications: Collection['VariableSpecification']
ScatteredAccessDescriptionVariableSpecification(specifications,)
Create new instance of ScatteredAccessDescriptionVariableSpecification(specifications,)
Alias for field number 0
262class VariableDescriptionVariableSpecification(typing.NamedTuple): 263 address: int | str | util.Bytes 264 type_specification: TypeDescription | ObjectName
VariableDescriptionVariableSpecification(address, type_specification)
Create new instance of VariableDescriptionVariableSpecification(address, type_specification)
Alias for field number 1
StatusRequest()
281class GetNameListRequest(typing.NamedTuple): 282 object_class: ObjectClass 283 object_scope: ObjectScope 284 continue_after: str | None
GetNameListRequest(object_class, object_scope, continue_after)
Create new instance of GetNameListRequest(object_class, object_scope, continue_after)
Alias for field number 1
IdentifyRequest()
291class GetVariableAccessAttributesRequest(typing.NamedTuple): 292 value: ObjectName | int | str | util.Bytes
GetVariableAccessAttributesRequest(value,)
Create new instance of GetVariableAccessAttributesRequest(value,)
Alias for field number 0
GetNamedVariableListAttributesRequest(value,)
Create new instance of GetNamedVariableListAttributesRequest(value,)
ReadRequest(value,)
Create new instance of ReadRequest(value,)
Alias for field number 0
303class WriteRequest(typing.NamedTuple): 304 specification: Collection[VariableSpecification] | ObjectName 305 data: Collection[Data]
WriteRequest(specification, data)
Create new instance of WriteRequest(specification, data)
Alias for field number 0
Alias for field number 1
308class DefineNamedVariableListRequest(typing.NamedTuple): 309 name: ObjectName 310 specification: Collection[VariableSpecification]
DefineNamedVariableListRequest(name, specification)
Create new instance of DefineNamedVariableListRequest(name, specification)
Alias for field number 1
DeleteNamedVariableListRequest(names,)
Create new instance of DeleteNamedVariableListRequest(names,)
Alias for field number 0
StatusResponse(logical, physical)
335class GetNameListResponse(typing.NamedTuple): 336 identifiers: Collection[str] 337 more_follows: bool
GetNameListResponse(identifiers, more_follows)
340class IdentifyResponse(typing.NamedTuple): 341 vendor: str 342 model: str 343 revision: str 344 syntaxes: Collection[asn1.ObjectIdentifier] | None
IdentifyResponse(vendor, model, revision, syntaxes)
347class GetVariableAccessAttributesResponse(typing.NamedTuple): 348 mms_deletable: bool 349 type_description: TypeDescription
GetVariableAccessAttributesResponse(mms_deletable, type_description)
Create new instance of GetVariableAccessAttributesResponse(mms_deletable, type_description)
Alias for field number 1
352class GetNamedVariableListAttributesResponse(typing.NamedTuple): 353 mms_deletable: bool 354 specification: Collection[VariableSpecification]
GetNamedVariableListAttributesResponse(mms_deletable, specification)
Create new instance of GetNamedVariableListAttributesResponse(mms_deletable, specification)
Alias for field number 1
ReadResponse(results,)
Create new instance of ReadResponse(results,)
Alias for field number 0
WriteResponse(results,)
Create new instance of WriteResponse(results,)
DefineNamedVariableListResponse()
DeleteNamedVariableListResponse(matched, deleted)
387class VmdStateError(enum.Enum): 388 OTHER = 0 389 VMD_STATE_CONFLICT = 1 390 VMD_OPERATIONAL_PROBLEM = 2 391 DOMAIN_TRANSFER_PROBLEM = 3 392 STATE_MACHINE_ID_INVALID = 4
395class ApplicationReferenceError(enum.Enum): 396 OTHER = 0 397 APPLICATION_UNREACHABLE = 1 398 CONNECTION_LOST = 2 399 APPLICATION_REFERENCE_INVALID = 3 400 CONTEXT_UNSUPPORTED = 4
403class DefinitionError(enum.Enum): 404 OTHER = 0 405 OBJECT_UNDEFINED = 1 406 INVALID_ADDRESS = 2 407 TYPE_UNSUPPORTED = 3 408 TYPE_INCONSISTENT = 4 409 OBJECT_EXISTS = 5 410 OBJECT_ATTRIBUTE_INCONSISTENT = 6
413class ResourceError(enum.Enum): 414 OTHER = 0 415 MEMORY_UNAVAILABLE = 1 416 PROCESSOR_RESOURCE_UNAVAILABLE = 2 417 MASS_STORAGE_UNAVAILABLE = 3 418 CAPABILITY_UNAVAILABLE = 4 419 CAPABILITY_UNKNOWN = 5
422class ServiceError(enum.Enum): 423 OTHER = 0 424 PRIMITIVES_OUT_OF_SEQUENCE = 1 425 OBJECT_STATE_CONFLICT = 2 426 PDU_SIZE = 3 427 CONTINUATION_INVALID = 4 428 OBJECT_CONSTRAINT_CONFLICT = 5
431class ServicePreemptError(enum.Enum): 432 OTHER = 0 433 TIMEOUT = 1 434 DEADLOCK = 2 435 CANCEL = 3
443class AccessError(enum.Enum): 444 OTHER = 0 445 OBJECT_ACCESS_UNSUPPORTED = 1 446 OBJECT_NON_EXISTENT = 2 447 OBJECT_ACCESS_DENIED = 3 448 OBJECT_INVALIDATED = 4
451class InitiateError(enum.Enum): 452 OTHER = 0 453 MAX_SERVICES_OUTSTANDING_CALLING_INSUFFICIENT = 3 454 MAX_SERVICES_OUTSTANDING_CALLED_INSUFFICIENT = 4 455 SERVICE_CBB_INSUFFICIENT = 5 456 PARAMETER_CBB_INSUFFICIENT = 6 457 NESTING_LEVEL_INSUFFICIENT = 7
465class CancelError(enum.Enum): 466 OTHER = 0 467 INVOKE_ID_UNKNOWN = 1 468 CANCEL_NOT_POSSIBLE = 2
471class FileError(enum.Enum): 472 OTHER = 0 473 FILENAME_AMBIGUOUS = 1 474 FILE_BUSY = 2 475 FILENAME_SYNTAX_ERROR = 3 476 CONTENT_TYPE_INVALID = 4 477 POSITION_INVALID = 5 478 FILE_ACCESS_DENIED = 6 479 FILE_NON_EXISTENT = 7 480 DUPLICATE_FILENAME = 8 481 INSUFFICIENT_SPACE_IN_FILESTORE = 9
OtherError(value,)
505class EventNotificationUnconfirmed(typing.NamedTuple): 506 enrollment: ObjectName 507 condition: ObjectName 508 severity: int 509 time: Data | int | None
EventNotificationUnconfirmed(enrollment, condition, severity, time)
Create new instance of EventNotificationUnconfirmed(enrollment, condition, severity, time)
Alias for field number 0
Alias for field number 1
Alias for field number 3
512class InformationReportUnconfirmed(typing.NamedTuple): 513 specification: Collection[VariableSpecification] | ObjectName 514 data: Collection[DataAccessError | Data]
InformationReportUnconfirmed(specification, data)
Create new instance of InformationReportUnconfirmed(specification, data)
Alias for field number 0
Alias for field number 1
UnsolicitedStatusUnconfirmed(logical, physical)