当前位置: 代码迷 >> C# >> 请问控制系统的编程思路
  详细解决方案

请问控制系统的编程思路

热度:98   发布时间:2016-05-05 03:47:43.0
请教控制系统的编程思路
各位大牛,
请教一下,我有个控制系统,就是C#+IO 控制卡,控制思路如下:
第一步:刷新输入的变量缓冲区
第二步:写输入信号到板卡
第三步:读板卡输出信号到信号变量缓冲区
第四步:根据状态执行动作
。。。
第n步:根据状态执行动作

要求如下:1.进入操作循环后, 从第1步执行到第n步,再回到第1步并执行到第n步,不断循环。
                  2,在执行循环的同时,可以点击界面上的按钮,执行其他操作。

现在不知道如何下手:
1.想用定时器,每250ms执行一次上面的循环,但是好像不行,如果循环内的操作超过250ms 就会出问题。
2.考虑过 while 循环,但是执行while时,界面上的按钮就控制不了了。

各位,有没有做过类似的项目或则会好的思路? 望赐教!
------解决思路----------------------
这明显是要用线程来执行循环啊,界面不会卡.
线程中一个循环结束的时候使用SLEEP, 可以把循环前的时间记下, 不足 250ms 的时候, SLEEP余下的时间.
------解决思路----------------------
写数据就是普通的写操作而已。这类系统流程设计的关键在于“读流程”。这要看你的设备驱动有没有给你提供事件驱动的接口(具体的事件方式有很多形式,例如可能是一个标准的.net事件,也可能是一个c回调函数指针之类的,等等多种形式)。

总之最坑爹最糟糕的,就是那种“while+sleep”程序设计思路,这种设计是实习生想出来的、不专业的。

一个消息到来了,系统来瞬间、及时地回调通知你的程序,而不是你的程序去轮询。就好像有个人如果通过QQ跟你说话,你的QQ立刻收到对方推送的消息了,而不是你的QQ去定时去查询消息(如果定是轮询的化,就算1分钟才去查询一次新消息,腾讯的服务器集群也迅速就被压跨了)。

轮询,都是业余做法。除非你的设备的驱动没有给你这个接口,而你又不能用汇编、纯c语言之类的去自己做驱动直接高效率地访问底层设备通讯中断程序,除非万不得已才会轮询。
------解决思路----------------------
关于“如果循环内的操作超过250ms 就会出问题”的说法,那是你的程序的设计问题。(假如使用它来轮询的话)定时器只是用来收到信息,也就是说每当250ms触发一下定时器动作,而这个动作中仅用1毫秒时间来读取数据,然后就结束了(收到的数据的处理是在子线程中操作的),于是就不会存在你说的所谓“就会出问题”的问题。
------解决思路----------------------

这控制系统不是走串口?看起来跟单片机没啥区别吧