public byte[] Read(long Address, int iLen, PLCMemRegion menRegion, bool Is32Data) { byte[] rcvData = null; short AddressMajor; byte AddressMinor; switch (menRegion) { case PLCMemRegion.DREGION: SendData(null, out rcvData, iLen, false, (short)Address, 0, PLCMemRegion.DREGION, Is32Data); break; case PLCMemRegion.WREGION: AddressTranslation(Address, out AddressMajor, out AddressMinor); SendData(null, out rcvData, iLen, false, AddressMajor, AddressMinor, PLCMemRegion.WREGION, false); break; case PLCMemRegion.DREGIONBIT: AddressTranslation(Address, out AddressMajor, out AddressMinor); SendData(null, out rcvData, iLen, false, AddressMajor, AddressMinor, PLCMemRegion.DREGIONBIT, false); break; case PLCMemRegion.CIOREGION: AddressTranslation(Address, out AddressMajor, out AddressMinor); SendData(null, out rcvData, iLen, false, AddressMajor, AddressMinor, PLCMemRegion.CIOREGION, false); break; } return(rcvData); }
public void Write(byte[] data, long Address, PLCMemRegion menRegion, bool Is32Data) { byte[] rcvData; short AddressMajor; byte AddressMinor; switch (menRegion) { case PLCMemRegion.DREGION: SendData(data, out rcvData, data.Length, true, (short)Address, 0, PLCMemRegion.DREGION, Is32Data); break; case PLCMemRegion.WREGION: AddressTranslation(Address, out AddressMajor, out AddressMinor); SendData(data, out rcvData, data.Length, true, AddressMajor, AddressMinor, PLCMemRegion.WREGION, Is32Data); break; case PLCMemRegion.DREGIONBIT: AddressTranslation(Address, out AddressMajor, out AddressMinor); SendData(data, out rcvData, data.Length, true, AddressMajor, AddressMinor, PLCMemRegion.DREGIONBIT, Is32Data); break; case PLCMemRegion.CIOREGION: AddressTranslation(Address, out AddressMajor, out AddressMinor); SendData(data, out rcvData, data.Length, true, AddressMajor, AddressMinor, PLCMemRegion.CIOREGION, Is32Data); break; } }
private byte[] SwapHLByte(byte[] data, PLCMemRegion region, bool Is32Data) { var result = new byte[data.Length]; if (PLCMemRegion.DREGION == region || PLCMemRegion.WREGION == region) { if (!Is32Data) { for (int i = 0; i < data.Length - 1; i += 2) { result[i] = data[i + 1]; result[i + 1] = data[i]; } } else { for (int i = 0; i < data.Length - 1; i += 4) { result[i] = data[i + 3]; result[i + 1] = data[i + 2]; result[i + 2] = data[i + 1]; result[i + 3] = data[i]; } } if (data.Length % 2 != 0) { result[data.Length - 1] = data[data.Length - 1]; } } else { for (int i = 0; i < data.Length; i++) { result[i] = data[i]; } } return(result); }
public void SendData(byte[] PLCCommand, out byte[] recvData, int commandLen, bool isWrite, short startAddrInt, byte startAddrFraction, PLCMemRegion memRegion,//内存区域, bool is32Data ) { recvData = null; byte m_highAddr; byte m_lowAddr; byte m_higLen; byte m_lowLen; int commandLenAlign; short dataLen; if (!is32Data) { if (isWrite) { if (PLCMemRegion.DREGION == memRegion) { dataLen = (short)(commandLen / 2); } else { dataLen = (short)commandLen; } } else { dataLen = (short)commandLen; } } else { if (!isWrite) { dataLen = (short)commandLen; } else { dataLen = (short)(commandLen / 2); } } commandLenAlign = dataLen * 2; short2byte(dataLen, out m_higLen, out m_lowLen); short2byte(startAddrInt, out m_highAddr, out m_lowAddr); byte[] fins_cmnd; if (isWrite) { fins_cmnd = new byte[18 + commandLen]; } else { fins_cmnd = new byte[18]; } //for (int i = 0; i < 16; i++) //{ // fins_cmnd[i] = sendHeader[i]; //} fins_cmnd[0] = 0x80; /*ICF*/ fins_cmnd[1] = 0x00; /*RSV*/ fins_cmnd[2] = 0x02; /*GCT*/ fins_cmnd[3] = 0x00; /*DNA*/ //fins_cmnd[20] = 0x6E;/*DA1*/ fins_cmnd[4] = m_IPPLC; fins_cmnd[5] = 0x00; /*DA2*/ fins_cmnd[6] = 0x00; /*SNA*/ //fins_cmnd[23] = 0xEF;/*SA1*/ fins_cmnd[7] = m_IPSelf; fins_cmnd[8] = 0x00; /*SID*/ fins_cmnd[9] = 0x00; fins_cmnd[10] = 0x01; /*MRC*/ if (isWrite) { fins_cmnd[11] = 0x02;/*SRC*/ } else { fins_cmnd[11] = 0x01;/*SRC*/ } // fins_cmnd[27] = (byte)readWrite;/*SRC--2代表写*/ /*READ START ADDRESS:DM 01*/ fins_cmnd[13] = m_highAddr; /*ICF*/ fins_cmnd[14] = m_lowAddr; /*ICF*/ fins_cmnd[16] = m_higLen; /*WORDS READ:150*/ fins_cmnd[17] = m_lowLen; //fins_cmnd[31] = startAddrFraction; switch (memRegion) { case PLCMemRegion.WREGION: fins_cmnd[12] = 0x31; /*VARIABLE TYPE:DM*/ // 31表示W区 fins_cmnd[15] = startAddrFraction; break; case PLCMemRegion.DREGION: fins_cmnd[12] = 0x82; /*VARIABLE TYPE:DM*/ // 82表示D区 fins_cmnd[15] = 0x00; break; case PLCMemRegion.DREGIONBIT: fins_cmnd[12] = 0x02; // 02表示bit位读取D区 fins_cmnd[15] = startAddrFraction; break; case PLCMemRegion.CIOREGION: fins_cmnd[12] = 0x30; // 30表示读取CIO的bit位 fins_cmnd[15] = startAddrFraction; break; } if (isWrite) { var commandBuffer = SwapHLByte(PLCCommand, memRegion, is32Data); for (int i = 0; i < commandBuffer.Length; i++) { fins_cmnd[i + 18] = commandBuffer[i]; } } Send(fins_cmnd); int recvLen; Receive(m_receiveData, out recvLen); if (recvLen < 14) { throw new Exception(string.Format("Failed to receive data in Fins protocal. Received {0} bytes.", recvLen)); } //if (m_receiveData[13] != 0x00 || m_receiveData[12] != 0x00) // throw new FormatException(string.Format("Received data doesn't match required format. Byte [8-11]! must be 00 00 00 02. Recieved {0}", // string.Join(" ", m_receiveData.Skip(8).Take(4).Select((x) => x.ToString("X2"))))); if (!isWrite) { // Read if (PLCMemRegion.DREGION == memRegion || PLCMemRegion.WREGION == memRegion) { recvData = SwapHLByte(m_receiveData.Take(recvLen).Skip(recvLen - commandLenAlign).ToArray(), memRegion, is32Data); } else { recvData = m_receiveData.Take(recvLen).Skip(recvLen - commandLenAlign / 2).ToArray(); } //if (commandLen != recvData.Length) //{ // Array.Resize(ref recvData, commandLen); //} } }