Example #1
0
        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);
        }
Example #2
0
        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;
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
                //}
            }
        }