当前位置:
工控论坛
> >
产品
>
工业互联
>
RS485/232/442
我要发帖
询问主机轮巡下位机编程思想
点击:
821
| 回复:
15
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-14 13:06:00
楼主
那位做过主机轮巡下位机的程序,请帮忙!说一下大致的编程思想!谢谢 我是32台下位机,我用VC写了一个轮巡的循环,但运行总是死机,太郁闷了!
分享到:
收藏
邀请回答
回复楼主
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-11 09:50:00
1楼
以 RS-485 网络中的某个 protocol 为例, 主机 broadcast command 出去, 所有的 从机 都会收到该 command. 从机 会判断 command 中所指定的 address 是不是自己, 若是自己的, 则继续处理该 command 并回覆结果. 若 address 不是自己的, 则丢弃不理会. 主机 送出 command 后, 得等待一段时间 (可能是 100ms, 看您的设配), 若是 timeout 了, 没有收到回覆. 则重送 or 问下一台 从机.
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-11 09:54:00
2楼
谢谢GaryLin的热心帮助. 我遇到的主要问题是:进入轮巡循环就死机了, 能帮帮我如何控制这个循环吗?谢谢
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-11 09:55:00
3楼
谢谢GaryLin的热心帮助. 我遇到的主要问题是:进入轮巡循环就死机了, 能帮帮我如何控制这个循环吗?谢谢
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-11 10:03:00
4楼
是 主机 死机? 还是 从机 死机? 通信是走 Ethernet ? RS-485 ? or ... ? 通信协议是一对一连线? 还是 broadcast ? 是否有设定 Timeout ? 说清楚一些, 看看大伙能否给些意见.
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-11 14:11:00
5楼
主机死机 通信使用RS232-RS485 通信协议用的是主机问,从机答 设定时间1妙轮巡一次(timeout约等于1000/32) 以上是我的用的方法,大家给看看 在次感激GaryLin!!
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-11 14:51:00
6楼
1000/32 = 31.25 (ms) 通信 baudrate 是多少? 单一从机的 问/答 需要多少 bytes, 时间? 问答时间是否低于 31 ms (more less is better) ? 主机死机的情形是怎么? 作业系统 crash? application crash? application blocked? 程式架构是如何? 无限的 loop ? Timer Event ? 可能的因素真的很多, 得一一搞清楚才行.
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-13 17:02:00
7楼
下边是我写的,GaryLin 看看哪儿不妥,谢谢!! void CAoliCommDlg::OnStar() { // TODO: Add your control notification handler code here int IDnum=1; star_control=true; //AfxMessageBox("开始轮巡"); while(star_control && IDnum<33) { m_ctrlComm.SetInBufferCount(0);//清除接收缓冲区 m_ctrlComm.SetOutBufferCount(0); TXD(IDnum);//发送下位机编号,相当于地址 Sleep(20); RXD(IDnum);//接收IDnum编号下位机数据 IDnum=(IDnum+1); if(IDnum>32) IDnum=1; } }
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-14 09:36:00
8楼
这样的 loop 看起来是 ok 的. 应该不至于使您的主机挂掉才是. ( 不过, 这是无限 loop, 应该加入结束的控制! ) 您可以先将 TXD() 与 RXD() 那两行 mark 掉试试. 这样会形成一个空的 loop, 在此情形下, 您的主机应该没理由死机了吧! 若是上述测试是 ok 的. 那问题可能就在 TXD() 或 RXD() 里面了. 您得再 trace 看看. 主机死机... 是不是 BSOD ? (Blue Screen Of Death)
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-14 10:25:00
9楼
谢谢GaryLin 的热心帮助 我使用 bool star_control 来控制loop的结束的,你觉得这样可行吗? 死机的情形是主机不响应任何操作,会不会这个 loop 占用了所有的资源?
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-14 10:46:00
10楼
1. 您的 star_control 是宣告为 local. 别的 function 无法对其 access/change. 所以您的 loop ... 是无限的 (always loop). 2. 在无限 loop 中, 的确可能使主机不响应. 印象中, 您得在 loop 中, 用 PeekMessage, TranslateMessage 去强制处理系统的 message. 这有份相关的文件可参考... http://www.csdn.net/develop/Read_Article.asp?Id=15000
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-14 12:02:00
11楼
Sorry! 看错了, 您的 star_control 不是 local 的. try this... void CAoliCommDlg::OnStar() { .... MSG msg; int i; star_control=true; while(star_control) { ....... TXD(IDnum); for (i=0; i<20; i++) { Sleep(1); if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { TranslateMessage(&msg); DispatchMessage(&msg); } } RXD(IDnum); ..... } }
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-14 12:14:00
12楼
或许用 while loop 来处理 message 会较好! while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { TranslateMessage(&msg); DispatchMessage(&msg); }
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-14 12:42:00
13楼
谢谢GaryLin 在你的热心指导下轮巡已经可以运转,但有出现新的问题,循环不能结束,你能不能再帮我看看 我本意使用while(star_control && IDnum<33)中的public bool star_control来控制循环的结束,实际情况是开始轮巡后,根本就不响应 star_control=false ; 这样的问题一般可能出在哪儿? 谢谢
回复
引用
举报
gongkongedit
关注
私信
精华:1099帖
求助:0帖
帖子:14392帖 | 54470回
年度积分:0
历史总积分:622
注册:2008年9月08日
发表于:2003-07-14 12:56:00
14楼
谢谢GaryLin 死循环问题已经解决!! 你真是高手加好人.难得啊 以后有问题还能向你请教吗?
回复
引用
举报
GaryLin
关注
私信
精华:0帖
求助:0帖
帖子:4帖 | 1186回
年度积分:0
历史总积分:1263
注册:2003年4月15日
发表于:2003-07-14 13:06:00
15楼
try this... bool volatile star_control;
回复
引用
举报
热门招聘
相关主题
现场总线通讯接地探讨
[5693]
RS485总线型网络具体怎么实现...
[3036]
CAN总线隔离专家ADUM1201
[1587]
PROFIBUS GSD文件是什么
[6845]
(海利普HLP-SV系列)变频器RS...
[7408]
综述:自律分散系统
[3182]
基于FF协议的无线PC接口卡设...
[1723]
几种现场总线在国内的发展展...
[7701]
寻求同盟-
[3001]
综述:流行现场总线简介
[6025]
官方公众号
智造工程师
客服
小程序
公众号