威伦kp6051ip和奥伯赛德风压变送器传输信息的问题 点击:582 | 回复:5



小白不大黑

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 6回
  • 年度积分:411
  • 历史总积分:411
  • 注册:2022年4月15日
发表于:2022-04-15 14:12:49
楼主
求助帖200分-已结帖

手头有威伦51ip的屏幕,打算吃30kpa量程的风压变送器。风压变送器用rs485通信;已经事先在电脑上sscom测试使用没有问题,如下图

image.png

必须先发风压变送器的指令,它才会返回数据。

发数据解释:01h 代表从机地址,现在是1,03h功能码,00 04h2位u16代表读取压强,00 01h2位u16代表传输压强的数据位数。后面c5 cb是crc校验

收数据解释:前2个u16与发数据一样(如果接收了的话),02h代表数据位数是2位,00 00h压差为00.00kpa。b8 44也是crc校验

好,硬件都没有问题,如何让屏幕自己发收数据呢?

我自己给屏的宏指令是

short data[6] = {0x00,0x04,0x00,0x01,0xc5,0xcb}
GetDataEx(data[0],"MODBUS RTU",4x,1,6)
SetDataEx(data[0],"Local HMI",RW,80,6)


考虑到威伦官方给的手册会把从机地址,从机功能码自己加上,所以我写了如上的代码。然而没有反应。下面给出手册截图

image.png

也就是说用4x的地址,屏幕应当是自己先给了01h 03h这样的开头,然后再附带data数组的六个数据组成01 03 00 04 00 01 c5 cb发出去给风压变送器,然后自己接收一串数据,存到data里,再写到RW区。


以上想法也许是错的,所以接着试验:如果威伦自己不带01 03开头如何?

short data1[8] = {0x01,0x03,0x00,0x04,0x00,0x01,0xc5,0xcb}

SetDataEx(data1[0],"MODBUS RTU",4x,1,8)
DELAY(1)
GetDataEx(data1[0],"MODBUS RTU",4x,1,8)
SetDataEx(data1[0],"Local HMI",RW,80,8)


失败了,我还试验了种种setdata和getdata,以及data数据内容的排列组合,我现在已经疯了。

现在目的就是这个屏幕到底怎么输出到modbus rtu去的,到底输出了什么导致没有反应?

我的导师说可以读,我不太确认,他也在忙别的事情,我不好打扰

最后附上系统参数设置

image.png

我还怀疑是设备类型的问题,应当用哪一个modbus呢?

image.png


1分不嫌少!


楼主最近还看过



关育谋

  • [版主]
  • 精华:5帖
  • 求助:22帖
  • 帖子:738帖 | 5640回
  • 年度积分:68
  • 历史总积分:84034
  • 注册:2004年5月28日
发表于:2022-04-15 15:37:41
1楼

默认设备参数如下:
1.png
添加一个Modbus RTU设备,如下所示:
2.png
画面组态,选择数值元件:
3.png
组态如下所示:
4.png
使用Modbus Slave进行仿真:
5.png
没有问题哦!!!如果合适请采纳。

小白不大黑

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 6回
  • 年度积分:411
  • 历史总积分:411
  • 注册:2022年4月15日
发表于:2022-04-15 18:21:02
2楼

好的,谢谢,发的问题我也解决了,问题不在发这边。我把威伦屏转usb连在电脑上,用sscom验证了,这个屏发东西没有问题。

这是我的宏指令


macro_command main()
unsigned char data[8] = {0x01,0x03,0x00,0x04,0x00,0x01,0xc5,0xcb}//必须用unsigned char而不是short
unsigned char result[8] = {0}
unsigned short res[8] = {0}
unsigned short flag = 0xff


OUTPORT(data[0],"RTU",8)//从串口发data
INPORT(result[0],"RTU",8,flag)//从串口收sscom串口数据
DELAY(10)
OUTPORT(result[0],"RTU",8)//返回给sscom


res[0] = 0 | result[1]
res[1] = 0 | result[0]
res[2] = 0 | result[3]
res[3] = 0 | result[2]
res[4] = 0 | result[4]
res[5] = 0 | result[5]
res[6] = 0 | result[6]
res[7] = 0 | result[7]


SetData(res[0],"Local HMI",RW,80,8)//显示内容
SetData(flag,"Local HMI",RW,90,1)
end macro_command


之前写的代码用的short是不对的,我的问题;然后手册给了一个收发串口的函数我也没有注意。

然后代码没有问题,但是验证的时候出问题了:

我先按下开关进行一次宏指令,串口先发出01 03 00 04 00 01 c5 cb,然后sscom点击发送随便一串数据,然后屏幕原原本本返回接收到的信息,如图:

image.png


经过多次实验,我发现第一个数据永远是对的,然后总会被吞一些数据;确实最可能是波特率有问题,但是:



image.png

不就是9600吗,我真的......

收数据还是有问题,请大佬指点。


小白不大黑

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 6回
  • 年度积分:411
  • 历史总积分:411
  • 注册:2022年4月15日
发表于:2022-04-15 18:29:46
3楼

搞定,漏了奇偶校验位

关育谋

  • [版主]
  • 精华:5帖
  • 求助:22帖
  • 帖子:738帖 | 5640回
  • 年度积分:68
  • 历史总积分:84034
  • 注册:2004年5月28日
发表于:2022-04-15 21:54:29
4楼

引用 "小白不大黑" 的回复,发表在3楼
        内容: 搞定,漏了奇偶校验位

波特率、数据位、校验方式、停止位等都很重要的。

Smile-lyc

  • [管理员]
  • 精华:127帖
  • 求助:50帖
  • 帖子:3482帖 | 22331回
  • 年度积分:1963
  • 历史总积分:145694
  • 注册:2006年8月04日
发表于:2022-06-05 15:48:17
5楼

感谢求助者和答疑者对求助答疑板块的厚爱,赠人玫瑰,手留余香。

对于求助者要求:

1、请在一个月内自行结贴,把悬赏积分(如果设置积分悬赏求助)发放给答疑者;

2、如果在求助答疑过程中,自己已经有效解决问题,建议大家把解决问题方法在自己求助帖分享,有效分享可以获得50积分奖励。

3、求助答疑板块版主结贴时间一般滞后30~45天,以方便大家对求助问题答疑足够时间,也为了每一个优秀答疑人员都可以获取到自己的积分和MP奖励。



热门招聘
相关主题

官方公众号

智造工程师