信捷PLC与通讯问题

lengxue79 2017-02-07 12:01:39
最近在做C#与信捷PLC方面的东西,寄存器D1002里的数值为浮点数65535,我用C#写了一段通讯代码,如下:
bool bolRead = false;
float fltData = 0;

try
{
DateTime dtNow;
TimeSpan tsOut;
byte[] bytBuffer = new byte[6];
bytBuffer[0] = 0x01;
bytBuffer[1] = 0x03;
byte[] bytAddr = stringToBytes(intAddr.ToString("X2").PadLeft(4, '0'));
bytBuffer[2] = bytAddr[0];
bytBuffer[3] = bytAddr[1];
bytBuffer[4] = 0x00;
bytBuffer[5] = 0x02;
byte[] bytCRC = CRC16(bytBuffer);

serPort.DiscardInBuffer();
serPort.Write(bytCRC, 0, bytCRC.Length);
dtNow = DateTime.Now;

Thread.Sleep(50);
int intCunt = serPort.BytesToRead;
if (intCunt > 0)
{
tsOut = DateTime.Now - dtNow;
if (tsOut.Milliseconds <= intTimeOut)
{
byte[] bytRec = new byte[intCunt];
int intRead = serPort.Read(bytRec, 0, bytRec.Length);

if (intRead >= 7)
{
byte[] bytCopy = new byte[4];
if (bytRec[1] == (byte)3 && bytRec[2] == (byte)2)
{
Array.Copy(bytRec, 3, bytCopy, 0, 2);
string strRece = string.Empty;
for (int i = 0; i < bytCopy.Length; i++)
{
byte bytBuff = bytCopy[i];
strRece += bytBuff.ToString("X").PadLeft(2, '0');
}
//string strDsc = strRece.Substring(4, 4) + strRece.Substring(0, 4);

fltData = BitConverter.ToSingle(bytCopy, 0);
bolRead = true;
PLC应该返回的数据为FFFF才对,但是只有FF00,请问大神么,我错在哪里?
...全文
1739 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2017-02-17
  • 打赏
  • 举报
回复
既然是标准的ModBus .. 为什么不直接引用ModBus.DLL直接读取呢 何必还自己解析. 所以现在问题就是 你还不知道 到底是你解析的有问题 还是设备回复的有问题. 建议你使用第三方成熟的类库操作 因为类库本身已经很完善 所以如果你数据有问题 很容易找到问题的所在..
lengxue79 2017-02-17
  • 打赏
  • 举报
回复
我用的ModBus RTU 通讯,补全下代码: public bool Read_D(int intAddr, out float fltValue) { bool bolRead = false; float fltData = 0; try { DateTime dtNow; TimeSpan tsOut; byte[] bytBuffer = new byte[6]; bytBuffer[0] = 0x01; bytBuffer[1] = 0x03; byte[] bytAddr = stringToBytes(intAddr.ToString("X2").PadLeft(4, '0')); bytBuffer[2] = bytAddr[0]; bytBuffer[3] = bytAddr[1]; bytBuffer[4] = 0x00; bytBuffer[5] = 0x02; byte[] bytCRC = CRC16(bytBuffer); serPort.DiscardInBuffer(); serPort.Write(bytCRC, 0, bytCRC.Length); dtNow = DateTime.Now; Thread.Sleep(20); int intCunt = serPort.BytesToRead; if (intCunt > 0) { tsOut = DateTime.Now - dtNow; if (tsOut.Milliseconds <= intTimeOut) { byte[] bytRec = new byte[intCunt]; int intRead = serPort.Read(bytRec, 0, bytRec.Length); if (intRead >= 7) { byte[] bytCopy = new byte[4]; if (bytRec[1] == (byte)3 && bytRec[2] == (byte)4) { Array.Copy(bytRec, 3, bytCopy, 0, 4); string strRece = string.Empty; for (int i = 0; i < bytCopy.Length; i++) { byte bytBuff = bytCopy[i]; strRece += bytBuff.ToString("X").PadLeft(2, '0'); } //string strDsc = strRece.Substring(4, 4) + strRece.Substring(0, 4); fltData = Convert.ToInt32(strRece, 16); bolRead = true; } } } else { strPError = "读取寄存器:" + intAddr.ToString() + "数据超时:" + tsOut.Milliseconds.ToString(); bolRead = false; } } else { bolRead = false; strPError = "PLC未反馈数据帧..."; } } catch (Exception expt) { bolRead = false; strPError = "读取寄存器:" + intAddr.ToString() + "发生异常:" + expt.Message; } fltValue = fltData; return bolRead; }
booksell 2017-02-15
  • 打赏
  • 举报
回复
你的代码不全,转换成ASCII码的代码呢,我估计你是用的Modbus ASCII通信协议吧?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧