Beispiel #1
0
        private static void ReceiveCallback(StateObject state)
        {
            if (state.bufferLen == -1)
            {
                status = true;
                return;
            }
            else if (state.bufferLen == -2)
            {
                // 断开连接
                status = false;
                return;
            }

            byte[] readBytes = new byte[state.bufferLen];
            Array.Copy(state.buffer, readBytes, state.bufferLen);
            int readLength = state.bufferLen;

            if (currentState == null)
            {
                return;
            }

            int currentFlag = currentState.oprFlag;

            if (currentFlag == 0)
            {
                if (readLength < 0x07)
                {
                    status = false;
                    goto __END__;
                }
                //status = true;
                session[0] = readBytes[4];
                session[1] = readBytes[5];
                session[2] = readBytes[6];
                session[3] = readBytes[7];
                OpenCIM();
            }
            else if (currentFlag == 1)
            {
                status  = true;
                ottd[0] = readBytes[44];
                ottd[1] = readBytes[45];
                ottd[2] = readBytes[46];
                ottd[3] = readBytes[47];
            }
            else if (currentFlag == 2)
            {
                if (readLength < 61 || readBytes[48] != 0 || readBytes[49] != 0)
                {
                    status = false;
                    goto __END__;
                }
                status = true;
                int nType = readBytes[59];
                nType  = (nType << 8);
                nType += readBytes[58];
                AbDataType dt   = (AbDataType)nType;
                byte[]     data = new byte[readLength - 60];
                Array.Copy(readBytes, 60, data, 0, readLength - 60);
                readCallback(data, readLength - 60, dt, currentState.idxFlag);
                readDone.Set();
            }
            else if (currentFlag == 3)
            {
                if (readLength < 58 || readBytes[48] != 0 || readBytes[49] != 0)
                {
                    status = false;
                    goto __END__;
                }
                status = true;
                writeDone.Reset();
            }
            else if (currentFlag == 4)
            {
                status = false;
                UnRegisterSession();
            }
            else if (currentFlag == 5)
            {
                status = false;
                client.Close();
            }
__END__:
            trigger.Set();
        }
Beispiel #2
0
        public static void Write(string strTag, byte[] pszData, AbDataType dt)
        {
            StateObject state = new StateObject();

            state.oprFlag = 3;
            int i       = 0;
            int nLength = strTag.Length;

            int nDataLen = 0;

            switch (dt)
            {
            case AbDataType.Bool:
                nDataLen = 1;
                break;

            case AbDataType.Int:
                nDataLen = 2;
                break;

            case AbDataType.Real:
            case AbDataType.DInt:
                nDataLen = 4;
                break;

            case AbDataType.Byte:
                nDataLen = pszData.Length;
                break;
            }

            byte[] szPath   = new byte[255];
            int    nPathLen = 0;

            GenPath(strTag, ref szPath, ref nPathLen);

            state.buffer[i++] = 0x70;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = (byte)(0x2a + nPathLen + nDataLen);
            state.buffer[i++] = 0x00;

            state.buffer[i++] = session[0];
            state.buffer[i++] = session[1];
            state.buffer[i++] = session[2];
            state.buffer[i++] = session[3];

            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0x02;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0xa1;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = 0x04;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = ottd[0];
            state.buffer[i++] = ottd[1];
            state.buffer[i++] = ottd[2];
            state.buffer[i++] = ottd[3];

            state.buffer[i++] = 0xb1;
            state.buffer[i++] = 0x00;

            state.buffer[i++] = (byte)(0x16 + nPathLen + nDataLen);         // length
            state.buffer[i++] = 0x00;

            // seq count
            if (seqCount > 0xffff)
            {
                seqCount = 0;
            }
            seqCount++;
            state.buffer[i++] = (byte)(seqCount & 0xff);
            state.buffer[i++] = (byte)((seqCount >> 8) & 0xff);

            state.buffer[i++] = 0x0a;
            state.buffer[i++] = 0x02;
            state.buffer[i++] = 0x20;
            state.buffer[i++] = 0x02;
            state.buffer[i++] = 0x24;
            state.buffer[i++] = 0x01;
            state.buffer[i++] = 0x01;
            state.buffer[i++] = 0x00;
            state.buffer[i++] = 0x04;
            state.buffer[i++] = 0x00;
            //
            state.buffer[i++] = 0x53;
            state.buffer[i++] = (byte)(nPathLen / 2);         // word size

            for (int j = 0; j < nPathLen; j++)
            {
                state.buffer[i++] = szPath[j];
            }

            switch (dt)
            {
            case AbDataType.Int:
                state.buffer[i++] = 0xc3;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x01;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = pszData[0];
                state.buffer[i++] = pszData[1];
                break;

            case AbDataType.Real:
                state.buffer[i++] = 0xca;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x01;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = pszData[0];
                state.buffer[i++] = pszData[1];
                state.buffer[i++] = pszData[2];
                state.buffer[i++] = pszData[3];
                break;

            case AbDataType.Bool:
                state.buffer[i++] = 0xc1;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x01;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = pszData[0];
                break;

            case AbDataType.DInt:
                state.buffer[i++] = 0xc4;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x01;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = pszData[0];
                state.buffer[i++] = pszData[1];
                state.buffer[i++] = pszData[2];
                state.buffer[i++] = pszData[3];
                break;

            case AbDataType.Byte:
            {
                state.buffer[i++] = 0xc2;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = (byte)(nDataLen & 0xff);
                state.buffer[i++] = (byte)((nDataLen >> 8) & 0xff);
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                state.buffer[i++] = 0x00;
                for (int j = 0; j < nDataLen; j++)
                {
                    state.buffer[i++] = pszData[j];
                }
            }
            break;

            default:
                break;
            }
            state.bufferLen = i;
            Push(state);
            //client.Send(state);
        }