blob: 0abe2344834bbf722ae79bf30c13196a5232b0fe [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// Remark: The different fields are encoded in Big-endian.
[type 'ModbusConstants'
[const uint 16 'modbusTcpDefaultPort' '502']
]
[type 'ModbusTcpADU' [bit 'response']
// It is used for transaction pairing, the MODBUS server copies in the response the transaction
// identifier of the request.
[simple uint 16 'transactionIdentifier']
// It is used for intra-system multiplexing. The MODBUS protocol is identified by the value 0.
[const uint 16 'protocolIdentifier' '0x0000']
// The length field is a byte count of the following fields, including the Unit Identifier and
// data fields.
[implicit uint 16 'length' 'pdu.lengthInBytes + 1']
// This field is used for intra-system routing purpose. It is typically used to communicate to
// a MODBUS+ or a MODBUS serial line slave through a gateway between an Ethernet TCP-IP network
// and a MODBUS serial line. This field is set by the MODBUS Client in the request and must be
// returned with the same value in the response by the server.
[simple uint 8 'unitIdentifier']
// The actual modbus payload
[simple ModbusPDU 'pdu' ['response']]
]
[type 'ModbusSerialADU' [bit 'response']
[simple uint 16 'transactionId']
[reserved uint 16 '0x0000']
[simple uint 16 'length']
[simple uint 8 'address']
// The actual modbus payload
[simple ModbusPDU 'pdu' ['response']]
]
[discriminatedType 'ModbusPDU' [bit 'response']
[discriminator bit 'error']
[discriminator uint 7 'function']
[typeSwitch 'error','function','response'
['true' ModbusPDUError
[simple uint 8 'exceptionCode']
]
// Bit Access
['false','0x02','false' ModbusPDUReadDiscreteInputsRequest
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
]
['false','0x02','true' ModbusPDUReadDiscreteInputsResponse
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x01','false' ModbusPDUReadCoilsRequest
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
]
['false','0x01','true' ModbusPDUReadCoilsResponse
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x05','false' ModbusPDUWriteSingleCoilRequest
[simple uint 16 'address']
[simple uint 16 'value']
]
['false','0x05','true' ModbusPDUWriteSingleCoilResponse
[simple uint 16 'address']
[simple uint 16 'value']
]
['false','0x0F','false' ModbusPDUWriteMultipleCoilsRequest
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x0F','true' ModbusPDUWriteMultipleCoilsResponse
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
]
// Uint 16 Access (short)
['false','0x04','false' ModbusPDUReadInputRegistersRequest
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
]
['false','0x04','true' ModbusPDUReadInputRegistersResponse
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x03','false' ModbusPDUReadHoldingRegistersRequest
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
]
['false','0x03','true' ModbusPDUReadHoldingRegistersResponse
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x06','false' ModbusPDUWriteSingleRegisterRequest
[simple uint 16 'address']
[simple uint 16 'value']
]
['false','0x06','true' ModbusPDUWriteSingleRegisterResponse
[simple uint 16 'address']
[simple uint 16 'value']
]
['false','0x10','false' ModbusPDUWriteMultipleHoldingRegistersRequest
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x10','true' ModbusPDUWriteMultipleHoldingRegistersResponse
[simple uint 16 'startingAddress']
[simple uint 16 'quantity']
]
['false','0x17','false' ModbusPDUReadWriteMultipleHoldingRegistersRequest
[simple uint 16 'readStartingAddress']
[simple uint 16 'readQuantity']
[simple uint 16 'writeStartingAddress']
[simple uint 16 'writeQuantity']
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x17','true' ModbusPDUReadWriteMultipleHoldingRegistersResponse
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x16','false' ModbusPDUMaskWriteHoldingRegisterRequest
[simple uint 16 'referenceAddress']
[simple uint 16 'andMask']
[simple uint 16 'orMask']
]
['false','0x16','true' ModbusPDUMaskWriteHoldingRegisterResponse
[simple uint 16 'referenceAddress']
[simple uint 16 'andMask']
[simple uint 16 'orMask']
]
['false','0x18','false' ModbusPDUReadFifoQueueRequest
[simple uint 16 'fifoPointerAddress']
]
['false','0x18','true' ModbusPDUReadFifoQueueResponse
[implicit uint 16 'byteCount' '(COUNT(fifoValue) * 2) + 2']
[implicit uint 16 'fifoCount' '(COUNT(fifoValue) * 2) / 2']
[array uint 16 'fifoValue' count 'fifoCount']
]
// File Record Access
['false','0x14','false' ModbusPDUReadFileRecordRequest
[implicit uint 8 'byteCount' 'ARRAY_SIZE_IN_BYTES(items)']
[array ModbusPDUReadFileRecordRequestItem 'items' length 'byteCount']
]
['false','0x14','true' ModbusPDUReadFileRecordResponse
[implicit uint 8 'byteCount' 'ARRAY_SIZE_IN_BYTES(items)']
[array ModbusPDUReadFileRecordResponseItem 'items' length 'byteCount']
]
['false','0x15','false' ModbusPDUWriteFileRecordRequest
[implicit uint 8 'byteCount' 'ARRAY_SIZE_IN_BYTES(items)']
[array ModbusPDUWriteFileRecordRequestItem 'items' length 'byteCount']
]
['false','0x15','true' ModbusPDUWriteFileRecordResponse
[implicit uint 8 'byteCount' 'ARRAY_SIZE_IN_BYTES(items)']
[array ModbusPDUWriteFileRecordResponseItem 'items' length 'byteCount']
]
// Diagnostics (Serial Line Only)
['false','0x07','false' ModbusPDUReadExceptionStatusRequest
]
['false','0x07','true' ModbusPDUReadExceptionStatusResponse
[simple uint 8 'value']
]
['false','0x08','false' ModbusPDUDiagnosticRequest
// TODO: Implement the sub-request discriminated type
]
['false','0x08','true' ModbusPDUDiagnosticResponse
// TODO: Implement the sub-request discriminated type
]
['false','0x0B','false' ModbusPDUGetComEventCounterRequest
]
['false','0x0B','true' ModbusPDUGetComEventCounterResponse
[simple uint 16 'status']
[simple uint 16 'eventCount']
]
['false','0x0C','false' ModbusPDUGetComEventLogRequest
]
['false','0x0C','true' ModbusPDUGetComEventLogResponse
[implicit uint 8 'byteCount' 'COUNT(events) + 6']
[simple uint 16 'status']
[simple uint 16 'eventCount']
[simple uint 16 'messageCount']
[array int 8 'events' count 'byteCount - 6']
]
['false','0x11','false' ModbusPDUReportServerIdRequest
]
['false','0x11','true' ModbusPDUReportServerIdResponse
// TODO: This is not specified very well in the spec ... investigate.
[implicit uint 8 'byteCount' 'COUNT(value)']
[array int 8 'value' count 'byteCount']
]
['false','0x2B','false' ModbusPDUReadDeviceIdentificationRequest
]
['false','0x2B','true' ModbusPDUReadDeviceIdentificationResponse
]
]
]
[type 'ModbusPDUReadFileRecordRequestItem'
[simple uint 8 'referenceType']
[simple uint 16 'fileNumber']
[simple uint 16 'recordNumber']
[simple uint 16 'recordLength']
]
[type 'ModbusPDUReadFileRecordResponseItem'
[implicit uint 8 'dataLength' 'COUNT(data) + 1']
[simple uint 8 'referenceType']
[array int 8 'data' length 'dataLength - 1']
]
[type 'ModbusPDUWriteFileRecordRequestItem'
[simple uint 8 'referenceType']
[simple uint 16 'fileNumber']
[simple uint 16 'recordNumber']
[implicit uint 16 'recordLength' '(COUNT(recordData) * 2) / 2']
[array uint 16 'recordData' length 'recordLength * 2']
]
[type 'ModbusPDUWriteFileRecordResponseItem'
[simple uint 8 'referenceType']
[simple uint 16 'fileNumber']
[simple uint 16 'recordNumber']
[implicit uint 16 'recordLength' '(COUNT(recordData) * 2) / 2']
[array uint 16 'recordData' length 'recordLength * 2']
]
[dataIo 'DataItem' [uint 8 'dataType', uint 8 'numberOfValues']
[typeSwitch 'dataType','numberOfValues'
['1','1' Boolean
[reserved uint 7 '0x00']
[simple bit 'value']
]
['1' List
[array bit 'value' count 'numberOfValues']
]
['2','1' Integer
[simple int 16 'value']
]
['2' List
[array int 16 'value' count 'numberOfValues']
]
]
]