搜索
bottom↓
回复: 47

求助---单片机与PLC串口通讯问题

[复制链接]

出0入0汤圆

发表于 2009-4-17 10:12:20 | 显示全部楼层 |阅读模式
我做了一个数据采集模块,采集的数据然后通过RS485 发送出去,

我通过一个RS485转232转换器与电脑连接,数据接收与发送 以前正常,非常稳定,

昨天去一家客户那,做配套,他们的设备使用的是欧姆龙的PLC,PLC的串口1插了一个RS485模块,连接进去后,PLC上的RS485模块的COMM灯一直在闪,表示串口有数据传入,
但是客户那里的PLC工程师不会做串口编程以及设置,一直调试了好久,都不会把数据接收到寄存器里面,还说我的串口有问题。

本来RS485只是一个硬件协议的,即使是我定义的软件协议有问题,至少是能接收到字符,但是现在寄存器里面的串口接收数据都没有,还说是RS485协议有问题。我听了都笑死了。

我不懂PLC编程,哪位做过类似的应用,帮我写一个PLC程序,以及一些相关的设置。
他们老板和我们老板是朋友,没有办法必须的帮他们解决,

我的软件通讯协议 很简单的

协议如下:

byte:   0       1       2       3       4       5       6      7      8         9          10         11
定义:  0x02   符号位 数据高位          ---------------------  低位 小数点位置  校验高4位  校验低4位  0x03

一帧数据共12个字节
1、起始符号:0x02
2、结束符号:0x03
3、符号位 “+” 或“-” 的ASCII
4、数据 为 0~9的ASCII
5、小数点位置,从数据右边数的第几位 ,也是ASCII形式
6、校验位:从 字节1--字节8 的异或, 高4位+0x30, 低4位 + 0x30,

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-4-17 10:28:33 | 显示全部楼层
偶不懂PLC 纯属帮顶,顺便学习下你的通信协议,嘿嘿

出0入0汤圆

 楼主| 发表于 2009-4-17 10:33:39 | 显示全部楼层
这个协议很简单的

市场上很多仪表与电脑通讯都是这个协议的,网上找找就有的

在通讯速度要求不高的场合 很实用的

继续==== 一直到天荒地老!!

出0入0汤圆

发表于 2009-4-17 10:49:42 | 显示全部楼层
这样找问题嘛:
  PLC上不同厂家使用的不同,例如:施耐德使用的是MODBUS协议,就是操作DI、DO、AI、AO

  (1)、首先清楚欧姆龙PLC的协议
         
  (2)、然后编写一个最简单的通讯程序测试(无关的程序不要编写)
      就读欧姆龙PLC内部的线圈(DO)
  (3)、然后一步一步的测试其它功能

出0入0汤圆

发表于 2009-4-17 11:02:01 | 显示全部楼层
不明白你要做的是什么。
OMRON的PLC的通讯也是要有协议的,你是要采集PLC上的数据吗?
最好先用电脑调试一下,成功了再用单片机实现。

出0入0汤圆

发表于 2009-4-17 11:08:28 | 显示全部楼层
那个欧姆龙支持自由口通讯么。
可以试试用s7-200的,它的串口可以设置为自由口通讯模式,用于自定义协议的串口通讯。

出0入0汤圆

 楼主| 发表于 2009-4-17 11:52:53 | 显示全部楼层
我在楼主位说了:
1、单片机是作为数据采集,然后把数据传给PLC,
2、第一个问题是,数据已经发送过去了,但是当时调试的时候,连串口数据都没有读到(就是接收到的那些一个个字节),就不要谈什么MODBUS协议。

3、假如读到数据了,然后在PLC里面,根据楼主位所写的协议怎样还原成一个浮点数,或者整型数,这个在单片机或者PC软件是很简单的,但是PLC里面该怎么操作,不会 呵呵

4、单片机这头是没有问题的,已经在电脑上测试过的,很稳定,已经在其他产品上已经在使用了。

出0入0汤圆

 楼主| 发表于 2009-4-17 11:55:07 | 显示全部楼层
to erxun 老孟

什么是自由串口, 呵呵 PLC 我一点都不懂,就是那天调试的时候,稍微了解了一点
到时候我去问问那个PLC工程师,看他知道不

出0入0汤圆

发表于 2009-4-17 12:22:56 | 显示全部楼层
回答你的问题3:

通常PLC里面很少有直接用浮点数的,一般像你说的这种数据采集的值,都是放在保持型寄存器里面的,保持型寄存器比较常见是一个16位的无符号整型,因此,建议你在这头用16位整型来表示你的测值,至于整型值与浮点如何对应,比较常见有AD变换方式,比如,用码值20000表示你的工程值高,用4000,表示你的工程值低值.当然还有其他的类型的变换方式.

另外:确实好像很少听说欧姆龙的能够支持自由口通信的.

通常像你说的这种方式,我们一般比较推荐采用MODBUS协议,PLC做主站,你的单片机做从站,这样比较合理一点.关键还要再看一下欧姆龙的PLC,他支持的通信方式有哪些?我记得好像欧姆龙的通信能力是不太好的.


另外:刚才仔细看你的协议,你的协议是主动上送的方式?还是召唤应答的呢?如果是前者的话,确实PLC的灯会亮。欧姆龙的PLC很有可能解析不了你的协议。呵呵,那样麻烦就大了。

出0入0汤圆

 楼主| 发表于 2009-4-17 12:33:53 | 显示全部楼层
谢谢 oldtom

那我就用整型数,在PLC里面处理的时候,通讯协议里面那个小数点位置 就直接忽略他,就是整型数,只是数值上大了 10倍 或者100被而已。

我记得三菱的PLC里面有个命令就是用于ASCII直接转换成一个数值,不知道欧姆龙的PLC有不?

如果有的话,那就好办了,直接就可以转化了,

如果我的单片机直接把一个长整型数,拆分成4个字节,直接发送过去,不知道在PLC里面操作转化起来是否会容易点?

出0入0汤圆

 楼主| 发表于 2009-4-17 12:35:33 | 显示全部楼层
呵呵
是麻烦大了啊

我的是采用主动发送的,因为从机只有一个,所以没有采用问答的方式。

我的协议就是modbus-ASCII协议,只是根据PLC稍微改动了一点,
一个是根据PLC默认的帧头和帧未改成0x02 和0x03
一个是校验方式采用简单的 字节异或,

出0入0汤圆

发表于 2009-4-17 12:43:54 | 显示全部楼层
欧姆龙的PLC恐怕不能这么做。我对日系的PLC了解甚少,建议你还是了解看欧姆龙能这么不!顺带问一个题外话,你的数据采集模块是采集啥东西的呢?

出0入0汤圆

 楼主| 发表于 2009-4-17 12:46:06 | 显示全部楼层
采集 0~20mV的差分信号

比如压力传感器、称重传感器, 这些传感器内部就是一个会斯通电桥。
主要是采集这些信号的

出0入0汤圆

 楼主| 发表于 2009-4-17 12:48:39 | 显示全部楼层
选用PLC是他们决定的,我们也没有办法哦

现在主要问题还是在 数据接收上,如果能接收进来,一切还是都很好办的,

软件协议随时都能改的,反正的板子做了BOOTLOADER,程序直接就可以通过串口线更新

出0入0汤圆

发表于 2009-4-17 12:48:54 | 显示全部楼层
像这种模块,我建议你们可以搞一个modbus rtu协议,目前MODBUS RTU协议用的比较多,呵呵。我了解不多,欧姆龙PLC恐怕不能支持这种做法吧。

出0入0汤圆

发表于 2009-4-17 12:51:51 | 显示全部楼层
那是你的问题了,既然你的是作为主机,那就应该按照,PLC的标准读写地址,去把你的参数写入到PLC中,一般PLC的通讯设定为接收就可以了,连校验都可以省略。

出0入0汤圆

 楼主| 发表于 2009-4-17 12:53:54 | 显示全部楼层

好的,协议随时能改的,这个是没有问题,
到时候再次调试的时候,把他改过来

是不是改成modbus rtu 后,PLC里面只要在软件上设置一下就可以了,不需要自己在PLC里面编写转换程序?

出0入0汤圆

 楼主| 发表于 2009-4-17 12:57:48 | 显示全部楼层
to ntkz

"PLC的标准读写地址,去把你的参数写入到PLC中"

这个没有看明白

难道PLC可以通过串口,就像操作寄存器一样,可以写寄存器?

“PLC的标准读写地址” 没有见过这个标准,而且可以通过串口操作的

如果说是通过PLC的编程调试口“把你的参数写入到PLC中”那还是差不多

出75入4汤圆

发表于 2009-4-17 13:02:18 | 显示全部楼层
建议lz看看相应型号PLC的编程手册和通讯手册之类的。

出0入0汤圆

 楼主| 发表于 2009-4-17 13:06:12 | 显示全部楼层
呵呵
是在加紧看哦
我是对PLC一点都不懂的

我主要是做单片机这块,如果说我的软件协议有问题, 至少PLC里面是能接到字符是不?

现在主要问题就是 PLC连一个个字节都没有接到,郁闷啊

如过接到了 那后面的事情就好办了 呵呵!!

这两本书 我有三菱的,
但是欧姆龙的没有 哪位大侠有电子版本的传我一份

出0入0汤圆

 楼主| 发表于 2009-4-17 13:15:00 | 显示全部楼层
我现在 从新看了一下上面各位大虾所说了
现在说一下我的理解 ,不知道是不是这样的俄

如【erxun 老孟】所说的,像我这种自己定义的协议,在PLC里面应该设置成 “自由口通讯”,然后在PLC里面自己组合成一个数据值。

现在可能原因是 欧姆龙不支持“自由口通讯”,PLC自己采用某种协议来解释我发送的字节,但是解释不成功,所以直接把接收缓存给清除了,所以在,调试的时候看不到接收缓存中的一个个字节。


各位大虾 不知道问题是不是这样的?

出0入0汤圆

发表于 2009-4-17 13:15:03 | 显示全部楼层
建议楼主用MODBUS-RTU方式(MODBUS-ASCII方式传输太占用RAM了。每个数值要拆成几个字节)。

  如果选用MODBUS-RTU协议,你的控制器就是主站,PLC就是从站。
  你发送命令,PLC才给你应答。

  其实MODBUS-RTU协议比较简单,就是读取DI(1X寄存器),读取DO/设置DO(0X寄存器),
  读取AI(3X寄存器),读取保持寄存器/设置保持寄存器(4X寄存器)

  记住:MODBUS协议是工业标准,基本上任何一家公司生产的RS232/RS485上都支持MODBUS协议。所有的组态软件也全部支持MODBUS协议。不要再使用既浪费时间,又浪费精力的自定义协议了。

出0入0汤圆

 楼主| 发表于 2009-4-17 13:16:52 | 显示全部楼层
to ba_wang_mao

谢谢!  我错了!我马上改 呵呵! 改成MODBUS-RTU

出0入0汤圆

发表于 2009-4-17 13:29:59 | 显示全部楼层
1 使用RTU, 最好让PLC做主站

2 按照RTU写代码,这里需要澄清一个问题,协议不对,PLC bull(敏感词0373)都收不到。

3 不要使用什么自由口通信,正如楼上所说,MODBUS是不收费的事实上的工业设备标准通信协议

东西我做过,关键在协议。

出0入0汤圆

 楼主| 发表于 2009-4-17 13:36:01 | 显示全部楼层
谢谢 以上各位了!

了解了

确实得 必须把协议做成MODBUS-RTU,马上动工 呵呵

有好的成绩,马上向各位汇报 哈哈!

真高兴  有可能解决问题了!

出0入0汤圆

发表于 2009-4-18 23:01:58 | 显示全部楼层
你好,这个OMRON PLC你要看一下是什么型号,如果是新系列的CP1系列是直接支持 MODBUS RTU 设备的,要是老型号的CMP1A CMP2A对这个MODBUS RTU支持就比较麻烦了,一般OMRON用的协议 最多的串口通讯还是HOSTLINK 如果你需要相关的说明书,可以联系我,我这里有一些OMRON的使用手册。QQ:38684866 。MSN :lulg100@hotmail.com

出0入0汤圆

发表于 2009-4-19 10:23:31 | 显示全部楼层
楼主所用的是自由通信协议(即自定协议),对方PLC工程师不会写通信程序的话,还是不要用这个协议,因为这样PLC要写很多程序来处理通信的。建议使用OMRON的 上位机链接协议,单片机作为上位机,可以读写PLC中任意内存区域(当然是在规定的范围内),PLC不需写通信程序。比如你可以用WD指令把采集到的数据写入D100.D101.D102...的内存区域。
有关OMRON 上位机链接协议的手册网上可以找的到,OMRON官方网站也有。

出0入0汤圆

发表于 2009-4-19 12:10:15 | 显示全部楼层
看了上面一些回复后我再说几句:
无协议通信(即自由通信)是几乎所有的PLC都支持的通信协议(所有大品牌的PLC都支持,OMRON全系列PLC都支持),要求通信的双方事先约定好通信协议,一方做主机,另一方或多方做从机(即1:1或1:N),然后各自编写通信程序,只有双方通信程序无误后方可正常通信。楼主所说的看不到PLC接收数据,如果PLC方程序没有写好的话可能是看不到任何接收的数据的。
MODBUS通信也是比较普遍一种通信方式,在工业上应用较多。这种协议是PLC做主机,其它设备做从机,PLC上不需写通信程序,但要设置相应数据,把要发送的数据写到相应发送区域内存中,而接收的数据则存储在接收区的内存中,PLC只需从接收区内存中取数据就行了。但该协议不是所有PLC都支持,有相当一部分PLC不支持,所有楼主应先询问客户的PLC是否支持。
上位链接协议是OMRON全系列PLC都支持的一种协议,协议格式都是一样的,不同处在于不同系列的PLC的读写内存范围不一样。这个协议要求PLC做为从机,而其它设备,例如计算机、人机界面等做为主机。主机按照协议格式可以读写任意的内存区域(协议指定的范围内),PLC方不需写程序,只要使用相应内存区的数据就行了,或者把数据放入相应内存区,主机即可读到该数据。

出0入0汤圆

发表于 2009-4-19 12:30:29 | 显示全部楼层
因为对方不会写PLC通信程序,我认为用上位链接协议(HOST LINK)比较好,你只管向PLC内存写数据,他只管使用这些数据就行了。

出0入0汤圆

 楼主| 发表于 2009-4-19 17:09:59 | 显示全部楼层

谢谢楼上的,非常的感谢!!

我听对方客户工程师说过的 支持HOSTLINK的

您那儿有相关手册 那是太好了 我需要这些,  我的QQ:39637663 E-Mial:knight@foxmail.com  马上加您的QQ;

以后还需要多请教您!

出0入0汤圆

 楼主| 发表于 2009-4-19 17:25:01 | 显示全部楼层
客户使用的PLC 是 CP1H

出0入0汤圆

发表于 2009-4-19 18:49:09 | 显示全部楼层
手册已发到你邮箱,注意查收

出0入0汤圆

发表于 2009-4-19 21:38:13 | 显示全部楼层
OMRON的PLC只需要你了解HOST LINK协议就很好啊办了。使用MOV 指令直接想数据传送的DM区域就可以读写了。实在不行就调用TXD/RXD指令很好用的。

出0入0汤圆

发表于 2009-4-19 22:44:42 | 显示全部楼层
点击此处下载 ourdev_437991.rar(文件大小:32.03M) (原文件名:SYSMAC CP1系列手册.rar)


用串口通讯似乎简单易行,看看手册的指令使用有关串口的部分。不过,要委屈你去搞PLC程序了。

出0入0汤圆

发表于 2009-4-20 09:59:02 | 显示全部楼层
HOSTLINK,绝对方便简单,就是自己要处理下数据,全ASCII码传送

出0入0汤圆

发表于 2009-4-20 12:22:51 | 显示全部楼层
看一下该款PLC的通信手册,首先确定用来连接的串口线是否符合手册上要求的,如果线序不对,也是读不到数的,我用过三菱的做与上位机的自由协议通信(无协议通信),很简单的,先让对方用PLC与PC机用串口助手监测通信成功后,再与你的单片机通信

出0入0汤圆

 楼主| 发表于 2009-4-20 19:02:20 | 显示全部楼层
谢谢 大家!!

我正在写HOSTlink 呵呵

出0入0汤圆

发表于 2009-6-22 14:49:28 | 显示全部楼层
是这样的
你的是单片机作的对吧,一个字节再发送时,起始位,停止位,可编程位(奇偶效验位),数据位,一共11位,你用的是8051吧,而单片机里的可编程位SM2你可以随便些1或者0,8051介绍多机通信的时候常用,而PLC则“奇偶效验”就是奇偶效验,不能可编程,这样就存在了问题 如果你作的是多机通讯

假设你是从站 你接受的时候要判断SM2=1才执行中断,所以你再发送的时候设置SM2=0 ,希望主站发送的数据SM2=1, 因为PLC只认为这个位表示的是“奇偶效验”所以主站(PLC)你无论设置奇效验 还是偶效验 都会认为接收的是错误,,而选择无效验呢,位数又少了一位,换句话说就是PLC认为你发送的带了奇偶效验位,而奇偶效验的结果是错误的,  除非赶上数据奇偶效验的时候程序认为SM2这个位应该自动补充0, 不知道说明白没  PLC再接收到数据后(为什么你看见PLC COMM灯再闪烁的原因是因为接收到了数据)发现奇偶效验错误 所以把数据清零了,所以从PLC本身上你看见的数据全是0的原因(数据接收到寄存器里面了,只是PLC自己给清零了)

你只要把你的SM2=0 或者SM2=1换成根据所作的奇偶效验自动补充(1或者0)问题就解决了 她的程序不一定错误 你的也没错 只是PLC不能作8051那个单片机中的多机通讯方式的格式  
这个问题害我查了N久   我的问题解决了
如果你能知道PLC也可以作的话 谢谢你能告诉我 我的QQ4242411 小弟再这里谢谢了

出0入0汤圆

发表于 2009-6-22 21:30:45 | 显示全部楼层
楼上很多人回答得都是正确地.我也做过OMRON PLC与单片机通讯和与电脑通讯的程序,其实是比较简单的.因为OMRON的HOST LINK协议是开放的.楼主要让OMRON PLC能读懂你的数据你得改改你的协议,直接将数据写到PLC的DM地址上.看看手册吧,真的很简单!

出0入0汤圆

发表于 2010-4-22 12:36:16 | 显示全部楼层
mark
头像被屏蔽

出0入0汤圆

发表于 2010-4-22 22:46:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2010-4-24 00:13:57 | 显示全部楼层
Omron通訊協議是Hostlink , 但你要寫入資料到PLC,還要用CX-Programer將PLC設為Monitor Mode.

出0入0汤圆

发表于 2011-2-2 07:31:23 | 显示全部楼层
xuexi

出0入0汤圆

发表于 2011-2-5 08:49:05 | 显示全部楼层
原来做过与国产信捷的自由通讯,很简单的,单片机直接发ASCII到PLC,单片机一直发,PLC一直收,没有奇偶检验,也没必要检验。

出0入0汤圆

发表于 2011-3-15 08:55:17 | 显示全部楼层
回复【楼主位】knight_avr  
-----------------------------------------------------------------------

大家点评到位,学习了,正好受用!

出0入0汤圆

发表于 2011-10-21 18:39:07 | 显示全部楼层
记号一个

出0入0汤圆

发表于 2011-10-21 21:08:40 | 显示全部楼层
自由口通信。别听上面的人瞎扯。

出0入0汤圆

发表于 2013-12-21 19:46:50 | 显示全部楼层
楼上都是高手啊,尤其是yu_studio,所说正解。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表