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(); }
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); }