using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; namespace FLY.ModbusModule { //class ModbusServer_Conn_ASCII:ModbusServer_Conn //{ // public Serial mSerial; // // For MODE_ASCII // int m_Scanpos; // int m_STARTpos; // int m_LFpos; // int m_CRpos; // const char m_STARTChar = ':'; // const char m_LFChar = (char)0x0A; // const char m_CRChar = (char)0x0D; // char[] cvrtlist = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; // /// <summary> // /// 从设备接收所有byte // /// </summary> // /// <returns></returns> // protected override int Receive_Polling() // { // int len = mSerial.Read(in_buf, in_len, MAX_BUFFER - in_len); // if (len > 0) // { // in_len += len; // return len; // } // else return 0; // } // /// <summary> // /// 从in_buf, 找出包, 只找一个包,多出去的都不要 // /// </summary> // /// <returns></returns> // protected override bool Receive_Packet() // { // int ret = 0; // if (in_len <= 0) return false; // int p = m_Scanpos; // while ((p < in_len) && (ret == 0)) // { // byte ch = in_buf[p]; // if (ch == m_STARTChar) // { // m_STARTpos = p; // m_LFpos = m_CRpos = -100; // } // else if (ch == m_CRChar)//0x0D // { // if (m_STARTpos >= 0) // { // m_CRpos = p; // m_LFpos = -100; // } // else // { // //数据异常 // m_STARTpos = -100; // m_CRpos = -100; // m_LFpos = -100; // } // } // else if (ch == m_LFChar)//0x0A // { // if (m_STARTpos >= 0) // { // m_LFpos = p; // if (m_CRpos == (p - 1)) // { // ret = 1; // } // else // { // //数据异常 // m_STARTpos = -100; // m_CRpos = -100; // m_LFpos = -100; // } // } // else // { // //数据异常 // m_STARTpos = -100; // m_CRpos = -100; // m_LFpos = -100; // } // } // p++; // } // if (ret == 1) // { // //if (m_debug) // //{ // // string s = "rec --"; // // for (int i = m_STARTpos; i < p; i++) // // { // // if (in_buf[i] == 0xD) // // s += "\\r"; // // else if (in_buf[i] == 0xA) // // s += "\\n"; // // else // // s += (char)in_buf[i]; // // } // // FDEBUG.Debug.LogMessage(this, 10, s); // //} // in_len = p; // } // if (m_STARTpos >= 0)//找到开始,没找到结尾 // { // int to; // int i, j; // to = in_len; // for (i = m_STARTpos, j = 0; i < to; i++, j++) // in_buf[j] = in_buf[i]; // in_len = j; // } // else // { // //清空所有 // Clear_Packet(); // } // m_Scanpos = in_len; // if (ret == 1) // return true; // return false; // } // /// <summary> // /// CheckADU return 0 ---OK, // /// -1---CRC Err // /// -2---Frame Err // /// </summary> // /// <returns></returns> // protected override CHECKADU_RESULT CheckADU() // { // byte lrc; // if (!m_checksum) // return CHECKADU_RESULT.OK; // if (in_len < 6) // return CHECKADU_RESULT.Frame_Err; // lrc = Misc.CRC.LRCDelta(in_buf, 1, in_len - 5); // if (in_buf[in_len - 4] != cvrtlist[lrc >> 4]) // return CHECKADU_RESULT.CRC_Err; // if (in_buf[in_len - 3] != cvrtlist[lrc & 0x0f]) // return CHECKADU_RESULT.CRC_Err; // return CHECKADU_RESULT.OK; // } // /// <summary> // /// in_buf -> ADU // /// </summary> // /// <param name="ptran"></param> // /// <returns></returns> // protected override bool TransferADU(Transaction_s ptran) // { // int i, j, n; // if (m_checksum) // n = in_len - 4; // else // n = in_len - 2; // i = 0; j = 1; // while (j < n) // { // char[] cs = new char[] { (char)in_buf[j], (char)in_buf[j + 1] }; // ptran.ADU[i] = byte.Parse(new string(cs), System.Globalization.NumberStyles.HexNumber); // j += 2; i++; // } // ptran.ADU_len = i; // ptran.header[0] = ptran.ADU[0]; // for (int k = 0; k < i - 1; k++) // { // ptran.ADU[k] = ptran.ADU[k + 1]; // } // ptran.ADU_len = i - 1; // return true; // } // /// <summary> // /// 清除接收区 // /// </summary> // protected override void Clear_Packet() // { // in_len = 0; // m_STARTpos = -1; // m_Scanpos = 0; // } // /// <summary> // /// 检测地址 // /// </summary> // /// <param name="tran"></param> // /// <returns></returns> // protected override bool CheckAddr(Transaction_s tran) // { // if (tran.header[0] == m_serv_addr) // return true; // return false; // } // /// <summary> // /// PDU->ADU // /// </summary> // /// <param name="ADU"></param> // /// <param name="ADU_index"></param> // /// <param name="ptran"></param> // /// <param name="RPDU"></param> // /// <param name="RPDU_index"></param> // /// <param name="rlen"></param> // /// <returns></returns> // protected override int MakeADU(byte[] ADU, int ADU_index, Transaction_s ptran, byte[] RPDU, int RPDU_index, int rlen) // { // int p = ADU_index; // int i; // byte lrc; // ADU[p++] = (byte)m_STARTChar; // ADU[p++] = (byte)cvrtlist[ptran.header[0] >> 4]; // ADU[p++] = (byte)cvrtlist[ptran.header[0] & 0x0f]; // for (i = 0; i < rlen; i++) // { // ADU[p++] = (byte)cvrtlist[RPDU[RPDU_index + i] >> 4]; // ADU[p++] = (byte)cvrtlist[RPDU[RPDU_index + i] & 0x0f]; // } // if (m_checksum) // { // lrc = Misc.CRC.LRCDelta(ADU, ADU_index + 1, p - 1 - ADU_index); // ADU[p++] = (byte)cvrtlist[lrc >> 4]; // ADU[p++] = (byte)cvrtlist[lrc & 0x0f]; // } // ADU[p++] = (byte)m_CRChar; // ADU[p++] = (byte)m_LFChar; // //if (m_debug) // //{ // // string s = "Sen --"; // // for (int j = ADU_index; j < p; j++) // // { // // if (ADU[j] == 0xD) // // s += "\\r"; // // else if (ADU[j] == 0xA) // // s += "\\n"; // // else // // s += (char)ADU[j]; // // } // // FDEBUG.Debug.LogMessage(this, 10, s); // //} // return p - ADU_index; // } // /// <summary> // /// 输出 // /// </summary> // /// <param name="ADU"></param> // /// <param name="len"></param> // protected override void Write(byte[] ADU, int len) // { // mSerial.Write(ADU, 0, len); // } //} //class ModbusServer_Conn_RTU:ModbusServer_Conn //{ // static TimeSpan TIMER_C35 = new TimeSpan(10 * 1000 * 35);//35ms // public Serial mSerial; // /// <summary> // /// 从设备接收所有byte // /// </summary> // /// <returns></returns> // protected override int Receive_Polling() // { // int len = mSerial.Read(in_buf, in_len, MAX_BUFFER - in_len); // if (len > 0) // { // in_len += len; // return len; // } // else return 0; // } // /// <summary> // /// 从in_buf, 找出包, 只找一个包,多出去的都不要 // /// </summary> // /// <returns></returns> // protected override bool Receive_Packet() // { // if (in_len <= 0) return false; // if (DateTime.Now.Subtract(last_recv_time) > TIMER_C35) // return true; // return false; // } // // CheckADU return 0 ---OK, // // -1---CRC Err // // -2---Frame Err // protected override CHECKADU_RESULT CheckADU() // { // UInt16 crc; // if (!m_checksum) // return CHECKADU_RESULT.OK; // if (in_len < 3) // return CHECKADU_RESULT.Frame_Err; // crc = Misc.CRC.CRC16(in_buf, 0, in_len - 2); // if (crc == ((in_buf[in_len - 1] << 8) | in_buf[in_len - 2])) // return CHECKADU_RESULT.OK; // else // return CHECKADU_RESULT.CRC_Err; // } // /// <summary> // /// in_buf -> ADU // /// </summary> // /// <param name="ptran"></param> // /// <returns></returns> // protected override bool TransferADU(Transaction_s ptran) // { // if (m_checksum) // ptran.ADU_len = in_len - 2-1; // else // ptran.ADU_len = in_len-1; // Array.Copy(in_buf, 1, ptran.ADU, 0, ptran.ADU_len); // ptran.header[0] = in_buf[0]; // return true; // } // /// <summary> // /// 清除接收区 // /// </summary> // protected override void Clear_Packet() // { // in_len = 0; // } // /// <summary> // /// 检测地址 // /// </summary> // /// <param name="tran"></param> // /// <returns></returns> // protected override bool CheckAddr(Transaction_s tran) // { // if (tran.header[0] == m_serv_addr) // return true; // return false; // } // /// <summary> // /// PDU->ADU // /// </summary> // /// <param name="ADU"></param> // /// <param name="ADU_index"></param> // /// <param name="ptran"></param> // /// <param name="RPDU"></param> // /// <param name="RPDU_index"></param> // /// <param name="rlen"></param> // /// <returns></returns> // protected override int MakeADU(byte[] ADU, int ADU_index, Transaction_s ptran, byte[] RPDU, int RPDU_index, int rlen) // { // int p = ADU_index; // UInt16 crc; // ADU[p++] = ptran.header[0]; // Array.Copy(RPDU, RPDU_index, ADU, p, rlen); // p += rlen; // if (m_checksum) // { // crc = Misc.CRC.CRC16(ADU, ADU_index, p); // ADU[p++] = (byte)crc; // ADU[p++] = (byte)(crc >> 8); // } // return p - ADU_index; // } // protected override void Write(byte[] ADU, int len) // { // mSerial.Write(ADU, 0, len); // } //} }