| ReadColils(start,count,out data) // read bits
->| SA,0x01,start[2],count[2],crc[2]
<-| SA,0x01,N,data[N],crc[2]
<-| SA,0x81,ERR,crc[2]
N=(count+7)/8
ERR=1 - not supported
2 - count<1 || count>0x07D0
3 - start || start+count invalid
4 - problem with reading discrete outputs
ReadDiscreteInputs(start,count,out data)
->| SA,0x02,start[2],count[2],crc[2]
<-| SA,0x02,N,data[N],crc[2]
<-| SA,0x82,ERR,crc[2]
N=(count+7)/8
ReadHoldingRegisters(start,count,out data)
->| SA,0x03,start[2],count[2],crc[2]
<-| SA,0x03,N,data[N],crc[2]
<-| SA,0x83,ERR,crc[2]
N=count*2
ReadInputRegisters(start,count,out data)
->| SA,0x04,start[2],count[2],crc[2]
<-| SA,0x04,N,data[N],crc[2]
<-| SA,0x84,ERR,crc[2]
N=count*2
WriteSingleCoil(start,value)
->| SA,0x05,start[2],value[2],crc[2]
<-| SA,0x05,start[2],value[2],crc[2]
<-| SA,0x85,ERR,crc[2]
value={ 0x0000, 0xFF00 }
WriteSingleRegister(start,value)
->| SA,0x06,start[2],value[2],crc[2]
<-| SA,0x06,start[2],value[2],crc[2]
<-| SA,0x86,ERR,crc[2]
ReadExceptionStatus(out status) (SerialLine only)
->| SA,0x07,crc[2]
<-| SA,0x07,status,crc[2]
<-| SA,0x87,ERR,crc[2]
status=bit fields - 8bits
Diagnostics(subfn,data) (SerialLine only)
->| SA,0x08,subfn[2],data[2*N],crc[2]
<-| SA,0x08,subfn[2],data[2*N],crc[2]
<-| SA,0x88,ERR,crc[2]
subfn
00 Return query data
01 Restart Communication Option
02 Return Diagnostic Register
03 Change ASCII Input Delimeter
04 Force Listen Only Mode
0A Clear Counters and Diagnostic Register
0B Return Bus Message Count
0C Return BUs Communication Error Count
0D Return Bus Exception Error Count
0E Return Slave Message Count
0F Return Slave No Response Count
10 Return Slave NAK Count
11 Return Slave Busy Count
12 Return Bus Character Overrun Count
14 Clear Overrun Counter and Flag
GetCommEventCounter(out status,out eventcount) (SerialLine only)
->| SA,0x0B,crc[2]
<-| SA,0x0B,Status[2],EventCount[2],crc[2]
<-| SA,0x8B,ERR,crc[2]
GetCommEventLog (SerialLine only)
->| SA,0x0C,crc[2]
<-| SA,0x0C,N,Status[2],EventCount[2],MessageCount[2],Events[N-6],crc[2]
<-| SA,0x8C,ERR,crc[2]
...
WriteMultipleCoils(start,count,coils)
->| SA,0x0F,start[2],count[2],N,data[N],crc[2]
<-| SA,0x0F,start[2],count[2],crc[2]
<-| SA,0x8F,ERR,crc[2]
N=(count+7)/8
WriteMultipleRegisters
->| SA,0x10,start[2],count[2],N,data[N],crc[2]
<-| SA,0x10,start[2],count[2],crc[2]
<-| SA,0x90,ERR,crc[2]
ReportSlaveID (SerialLine only)
->| SA,0x11,crc[2]
<-| SA,0x11,N,ID[],RunIndStatus,AdditionalData[],crc[2]
<-| SA,0x91,ERR,crc[2]
ReadFileRecord
->| SA,0x14,ByteCount,{ RefType=6,FileNum[2],RecNum[2],RecLen[2] }[],crc[2]
<-| SA,0x14,N, { FileRespLen,RefType=6,Data[RecLen*2] }[],crc[2]
<-| SA,0x94,ERR,crc[2]
WriteFileRecord
->| SA,0x15,ByteCount,{ RefType=6,FileNum[2],RecNum[2],RecLen[2],Data[RecLen*2] }[],crc[2]
<-| SA,0x15,ByteCount,{ RefType=6,FileNum[2],RecNum[2],RecLen[2],Data[RecLen*2] }[],crc[2]
<-| SA,0x95,ERR,crc[2]
MaskWriteRegister
->| SA,0x16,start[2],AndMask[2],OrMask[2],crc[2]
<-| SA,0x16,start[2],AndMask[2],OrMask[2],crc[2]
<-| SA,0x96,ERR,crc[2]
ReadWriteMultipleRegisters
->| SA,0x17,rstart[2],rcnt[2],wstart[2],wcnt[2],wN,data[wN],crc[2]
<-| SA,0x17,rN,data[rN],crc[2]
<-| SA,0x97,ERR,crc[2]
ReadFIFOQueue
->| SA,0x18,addr[2],crc[2]
<-| SA,0x18,len[2],count[2],data[count*2],crc[2]
<-| SA,0x98,ERR,crc[2]
len=2+count*2
EncapsulatedInterfaceTransport
->| SA,0x2B,MEIType,Data[],crc[2]
<-| SA,0x2B,MeIType,Data[],crc[2]
<-| SA,0xAB,ERR,crc[2]
|