首页 上一页 1 2 下一页 尾页

求助:200自由口编程 点击:1390 | 回复:27



郭zongkui

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-08 10:52:00
楼主
小弟最近编一通讯程序:内容为读一数字式温度采集模块的数据并且计算温度和存储。模块有8个通道。每个通道可以挂8个ds18b20数字式温度传感器。下面是通讯协议。我用的200为226,串口0被定义为自由口。小弟刚开始学习通讯编程,碰到了好多问题,老是连不上。哪位大虾能指点一二阿!比如系统的说一下需要注意哪些参数的设置,时序上面的东西等等,小弟感激不尽!


通讯波特率9600
发命令(5个字节):
第1字节:“#”
第2字节:“0”
第3字节:“0”
第4字节:“0”+CH-1       CH为测试通道号,1、2、……、8
第5字节:0x0D
系统返回数据:
该通道有传感器数:Tn
Tn=(N-5)/4         其中:N是返回总字节数
返回字节定义:
0 1 2 3 4 5 6 7 8    9 10 11 12 13 14 15 16.........            

字节0、1、2、3、4空
字节5、6、7、8(对应A、B、C、D)为第1个温度传感器温度值
字节9、10、11、12(对应A、B、C、D)为第2个温度传感器温度值
… …

温度算法:
正温度(当B and 0xF8 =0xF8):T=[(B and 7)*256+A]*0.0625
负温度(当B and 0xF8 =0x00):T=-[(256-B)*256-A]*0.0625




lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-01-08 11:11:00
1楼
请参照http://www.gongkong.com/tech/detail.asp?id=367460

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-08 11:33:00
2楼
很有帮助,但是不是很详细。不过仍然感谢!谢谢!

lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-01-08 11:59:00
3楼
有更详细的!等完全整理好了,帖到工控网上

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-08 12:45:00
4楼
谢谢了!可否快一点?等不及了!

春秋晓月

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 268回
  • 年度积分:0
  • 历史总积分:404
  • 注册:2006年2月07日
发表于:2007-01-08 13:00:00
5楼
ding!!!!

xiao a

  • 精华:1帖
  • 求助:0帖
  • 帖子:102帖 | 555回
  • 年度积分:0
  • 历史总积分:958
  • 注册:2005年12月10日
发表于:2007-01-08 18:32:00
6楼
请问你是什么通讯协议呀,你确定了通讯协议然后只要按照通讯协议格式利用XMT将其一一发送出去就可以了,如果是modbus协议RTU利用自由口读的话只要按 发送总的字节数(1 个字节),地址(一个字节),功能码(1 个字节),读取首地址(一个字),读取字数(1 个字),CRC(一个字)格式将数据事先写入到一你设定的如从VB100开始的寄存器区,然后用XMT VB100 0(或是1口)发送,利用RCV VB300 0 来接收返回数据。ASCII模式的你看了俄leeeeeeeeeeeee提供的

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-09 09:12:00
7楼
首先谢谢yi yi.
    不过好像没有用到modbus协议,但是你介绍的按照modbus协议发送跟我编的好像非常相似。我也是先用mov指令把上面的:

第1字节:“#”
第2字节:“0”
第3字节:“0”
第4字节:“0”+CH-1       CH为测试通道号,1、2、……、8
第5字节:0x0D

传到vb100开始的寄存器中,再用xmt把这些数据发送到定义好了的port0口。然后用发送中断,把接收到的数据存到vb200开始的寄存器中,再到相应的寄存器中取出数据进行相应的数学计算。
    我觉得这样的算法好像没有问题,应该可以联上。但是因为我以前没有很多的编程经验,所以在具体实现上很困难。比如编程技巧等等。
    1.在上面列出的通讯协议中,由于要发送的第四字节是0.1.2.3.4.5.6.7八个数据。所以我用了for-next循环。而且我把xmt指令和atch指令都放到了循环当中。不知道行不行。
    2.ascii码的处理:第一字节是“#”,在ascii码表中查到对应码是35,写成二进制是0010 0011,十六进制是0x23h,所以发送的第一字节就是0x23h。相应的第二第三字节最后发送的数据是不是
0x30h阿?请高手指点。还有最后回车0x0dh,是不是就发这个就行啊?
     3.还有开始和结束字符:我还需要在发送的刚开始发送字节数么(5)?最后发送的回车符可以发送完中断么?请高手指点。
     4.还有温度计算,我先用顺控继电器(scr)指令顺序读出协议里面接受字符中A 、B的值,在每一个s中都调用同一个字程序,用于计算温度。其中计算温度的编程技巧也用的scr指令。觉得有些不妥,但是不知道还有什么办法。



请各位高手指点,小弟洗耳恭听。

lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2007-01-09 09:30:00
8楼
没看懂你的意思!

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-09 09:41:00
9楼
不好意思,其实我就是具体编程的时候有点笨。比如涉及到循环 发送不知道用什么方法,比如上面第四字节的发送。还有接收完了之后的计算,不知道用什么方法。只是我在上面说出了具体的我的编程方法。谢谢  了俄leeeeeeeeeeeee。

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-09 11:21:00
10楼
各位老大,还有一个问题咨询阿,如何发送ascii码?   
需要发送一串数到自由口,其中一个是不断增长的,比如发送x、
0、0、a、cr。其中a是变化值。a=0.1.2.3.4.5.6.7
发送格式为ascii码,除了a以外的值可以以立即数的方式直接发送ascii码到指定的存储器,但是a应该怎么发呢?
我用的字节递增指令,inc-b指令,但是递增之后就转不成ascii码了,用ita指令和i-b指令都不行,请高手执教以下怎么实现阿?
谢谢!!!

xiao a

  • 精华:1帖
  • 求助:0帖
  • 帖子:102帖 | 555回
  • 年度积分:0
  • 历史总积分:958
  • 注册:2005年12月10日
发表于:2007-01-10 09:37:00
11楼
如果你从VB100开始写入#一系列5个字节的话,那你应该在VB99中写入要发送字节数5,然后XMT VB99 0来发送。 a中的0.1.2.3.4.5.6.7你可以行将其ASCII码先写到一些寄存器VB中如VB0到VB7中再利用一个读数器(当计到某数时传送某个VB)或定时器(用计时的)实现循环将其写到aVB103中。就是如利用计数器c0(c0=8时清0复位因为你传8个数),当c0=0时,mov vb0 vb103,当c0=1时,mov vb1 vb103,当c0=8时会复位重新由c0=0开始循环。

小龙虾

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 50回
  • 年度积分:0
  • 历史总积分:104
  • 注册:2003年4月02日
发表于:2007-01-10 11:03:00
12楼
建议采用中断方式:
1.定时中断,每隔一定时间执行发送程序并停止定时中断。
2.发送完成中断:启动接收程序
3.接收完成中断:数据处理,并再次使能定时中断
至于你说的循环方式。可以在成功接收数据后把第四个字节(通道号)加一(读取下一通道),到第八个通道时自动赋一,循环再次开始。
注意:1.起始和结束字符是不可少的。
2.调试时先测试通讯协议,不要考虑循环(即保证能读取数据,各硬件正常,协议正确)
3.可以RS232/485转换器在电脑上使用超级终端监视整个数据通讯过程。

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-10 12:56:00
13楼
非常谢谢yi yi和小龙虾。
to yiyi:
我会试试你说的用计数器或者定时器的方法实现循环。我一直对字节数是否发送怀疑,谢谢你的提醒。
to 小龙虾:
我用了发送中断和接收中断,但是没有用定时中断。我想让接受完了之后自动跳回主程序。不知道行不行。不过我想了一下,用定时中断好一点。但是有优先级,就是接收中断程序没有执行完的话,定时中断是不是不会起作用阿?那么定时中断是不是就没有用了?还有您说的循环方式具体实现方法是什么啊?是不是跟上面的yiyi一样啊,用定时器或者计数器?我用的for-next循环指令,但是不行。不过我还没有调试呢。还有,怎么用超级终端监视整个]数据通讯过程阿?我用深入浅出西门子200的书上介绍的例子好像不行阿,老是没反应?可以详细介绍一下么?
谢谢你的提示:注意1和2对我帮助很大。3还不是太懂。

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-10 14:34:00
14楼
to yiyi:
你好!我用你说的计数器和定时器试了一下,不会用。您可以比较详细的介绍一下怎么用计数器实现循环么?直观上是给个触发条件,计数器输出,发送一次数据。但是计数器输出的数据本身也要加一阿,这样一来是不是就麻烦了?yiyi大哥可以简单的写一下算法么?谢谢!

xiao a

  • 精华:1帖
  • 求助:0帖
  • 帖子:102帖 | 555回
  • 年度积分:0
  • 历史总积分:958
  • 注册:2005年12月10日
发表于:2007-01-10 19:57:00
15楼
我给你发了一个邮件,你看一下吧。

xiao a

  • 精华:1帖
  • 求助:0帖
  • 帖子:102帖 | 555回
  • 年度积分:0
  • 历史总积分:958
  • 注册:2005年12月10日
发表于:2007-01-10 19:57:00
16楼
我给你发了一个邮件,你看一下吧。

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-11 11:04:00
17楼
我看了您的程序了,受益匪浅,虽然还是没有联得上,但是又学了一个思路,谢谢阿!!!

灌水的鱼

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2002年11月16日
发表于:2007-01-12 11:26:00
18楼
哈哈,我刚刚做了一个自由口通讯程序,费了极大的力气,各方求助,西门子的咨询就他娘的一头母猪,让我自己去买书,建议大家以后不要打咨询电话了,接电话的废话一堆,就算打电话不要钱,那出差外地接电话也要钱撒。需要源程序的可以联系我啊,zengqh312@21cn.com

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-12 12:44:00
19楼
 你好,灌水的鱼,我正在郁闷中,老是通讯不上。希望多交流。

郭zongkui

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 153回
  • 年度积分:0
  • 历史总积分:297
  • 注册:2006年3月24日
发表于:2007-01-12 14:42:00
20楼
还有哪位大哥能发扬好精神,帮我看看程序阿,把邮箱留下好么?谢谢!

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页