询问主机轮巡下位机编程思想 点击:799 | 回复: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;

热门招聘
相关主题

官方公众号

智造工程师