public object ReadItem(string address) { lock (this) { try { if (DbAddress.ContainsKey(address)) { var addr = DbAddress[address]; var db_id = addr.DBBlockID; var offset = (short)(addr.Offset - _dbStartAddress[db_id]); if (addr.Type == "bool") { var _buf = _dbAreaBuf[db_id]; var _result_byte = _buf[offset]; var result = (_result_byte & (1 << addr.BitOffset)) != 0; return(result); } if (addr.Type == "int16") { var _buf = _dbAreaBuf[db_id]; var _low_byte = _buf[offset]; var _high_byte = _buf[offset + 1]; //Int16 result = (Int16)(_high_byte << 8 + _low_byte); var result = (short)((_low_byte << 8) + _high_byte); return(result); } if (addr.Type == "int32") { var _buf = _dbAreaBuf[db_id]; var _byte1 = _buf[offset]; var _byte2 = _buf[offset + 1]; var _byte3 = _buf[offset + 2]; var _byte4 = _buf[offset + 3]; //Int32 result = (Int32)(_byte4 << 24 + _byte3 << 16 + _byte2 << 8 + _byte1); var result = (_byte1 << 24) + (_byte2 << 16) + (_byte3 << 8) + _byte4; return(result); } if (addr.Type == "string") { var _buf = _dbAreaBuf[db_id]; var result = Encoding.ASCII.GetString(_buf, offset + 2, _buf[offset + 1]); //西门子字符串前两位要空出来,读取长度根据第2个字节 return(result); } if (addr.Type == "ByteArray") //2020/6/11 ByteArray { var _buf = _dbAreaBuf[db_id]; var result = Encoding.ASCII.GetString(_buf, offset, addr.BitOffset); return(result); } throw new Exception("Tag类型不支持"); } if (_mAddress.ContainsKey(address)) { var addr = _mAddress[address]; var offset = (short)(addr.Offset - _mAreaMinAddress); var _buf = _mAreaBuf; if (addr.Type == "bool") { var _result_byte = _buf[offset]; var result = (_result_byte & (1 << addr.BitOffset)) != 0; return(result); } if (addr.Type == "int16") { var _low_byte = _buf[offset]; var _high_byte = _buf[offset + 1]; var result = (short)((_low_byte << 8) + _high_byte); return(result); } if (addr.Type == "int32") { var _byte1 = _buf[offset]; var _byte2 = _buf[offset + 1]; var _byte3 = _buf[offset + 2]; var _byte4 = _buf[offset + 3]; //Int32 result = (Int32)(_byte4 << 24 + _byte3 << 16 + _byte2 << 8 + _byte1); var result = (_byte1 << 24) + (_byte2 << 16) + (_byte3 << 8) + _byte4; return(result); } } else { throw new Exception("_dbAddress或_MAddress不包含该地址!"); } } catch (Exception ex) { //LOG.Error(string.Format("地址{0}读取错:{1}", address, ex)); Log.Error($"Address:{address} readed error,Message:{ex},IP地址时{_plc.IP}"); } return(null); } }