首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VS平台多任务执行思路请问

2013-04-09 
VS平台多任务执行思路请教个人从事工控(PLC),PLC与VS的扫描和刷新方式不同,在上百条任务同时执行时,PLC占

VS平台多任务执行思路请教
个人从事工控(PLC),PLC与VS的扫描和刷新方式不同,
在上百条任务同时执行时,PLC占据优势,整体扫描整体刷新,
而VS就个人接触,均为单任务扫描(VS开上百条进程不知道CPU会如何表现),
而PLC在大批数据高级运算字符信息处理通讯等方面编程难度和价位成倍提升,
所以想引入VS控制方式,而多任务执行又成为解决问题的首要问题。
假设系统环境要求如下:
1.此系统有:报警、手动、自动、复位 四种状态
     a.报警:系统驱动执行某个任务,而等待N秒后发现此任务还未执行完成,这时候我需要界面提示出来
     b.手动:系统在通过界面操作执行某个单独的任务
     c.自动:系统复位完成并且无故障时,可以通过操作某个触发机制,上百个工站按照事先编辑好的任务同时执行,而每个工站内依次有若干任务,执行过程中如有执行任务超时需立即暂停所有自动运行任务,自动运行如无故障,单个工站的任务可循环执行,直到按下暂停按钮,所有自动任务暂停执行。
     d.复位:系统在没有自动运行而且没有警报的情况下按照事先编辑好的任务依次执行。
    系统任务如上所述,PLC执行此类任务毫无压力,而VS编程如何处理多任务刷新小弟暂时还没有完美的方案,还请各位大侠支招,只求思路,执行框架即可。
[解决办法]
写文字比较累,也写不清楚。画图说比较容易。

VB6可以写多线程,但成功的能实用的我一直没见过。


[解决办法]
PLC的"任务"和PC中的"任务"不是一个概念.
PLC中开关一个继电器也算一个任务. 对照PC来说,只是设置一个逻辑变量为0或1而已.
[解决办法]
PLC中的所谓多任务,大多数实际上也是通过扫描来实现的,并不是真正的并行,只有少量高性能PLC使用的是CPLD,FPGA之类的器件,这些才是完全并行,每个逻辑功能都是独立的硬件逻辑门去实现的,当然贵很多.

比如你所说的多IO的判断与执行,普通PLC仍然是扫描所有IO状态然后提交给处理过程去按用户编写的规则进行处理并最终输出结果.

只不过,由于是在硬件级别运行,因此速度方面比起层层封装的PC+WINDOWS系统+应用软件优得多,有些功能甚至还可以使用硬件中断来响应,从人的角度宏观来看,它们的处理是完全并行的,因为PLC可以轻易做到每秒扫描端口100次以上.

而完全并行的PLC,通过对CPLD或FPGA这种器件的编程,可以实现使用硬件逻辑电路实现功能的效率,响应几乎是实时的,比如汽车的ECU中就大量采用类似的器件来实现,但不便宜.

跑远了....

对于你的问题,其实没啥问题的...只需要做一个结构来处理多个任务的计时与状态判定即可.

引用:
假设系统环境要求如下:
1.此系统有:报警、手动、自动、复位 四种状态
     a.报警:系统驱动执行某个任务,而等待N秒后发现此任务还未执行完成,这时候我需要界面提示出来
     b.手动:系统在通过界面操作执行某个单独的任务
     c.自动:系统复位完成并且无故障时,可以通过操作某个触发机制,上百个工站按照事先编辑好的任务同时执行,而每个工站内依次有若干任务,执行过程中如有执行任务超时需立即暂停所有自动运行任务,自动运行如无故障,单个工站的任务可循环执行,直到按下暂停按钮,所有自动任务暂停执行。
     d.复位:系统在没有自动运行而且没有警报的情况下按照事先编辑好的任务依次执行。

你这个要求中,有几个关键点.

一是记录任务开始时间.
二是记录任务完成时间.
三是记录任务完成状态.
四是判断任务执行时间,用于判定超时. 

实现这几个关键点,其它的就非常好做了,而这几个关键点使用一个结构就好做了,如下:

private type TaskType
    TaskID as long        '任务ID
    StartTime as long     '开始时间
    FinishTime as long    '完成时间
    State as long         '0=停止,1=执行,2=错误
    RunningTime as long   '执行时间
    TimeOutValue as long  '超时时间
end type

定义一个上面类型的动态数组,在你添加任务时增加一个与任务相关的成员,写入相关的参数(超时时间,关联的任务ID等),并在任务开始时记录当时的时间戳(使用GetTickCount函数).

然后你肯定会有一个主循环或类似的机制判断每个任务的状态,在得到任务状态后,写入State.然后再次调用GetTickCount将当前值写入RunningTime中.

然后就可以判断当前的任务的经过时间(RunningTime - StartTime),与当前任务的超时时间(TimeOutValue)比较,就能知道是否超时.

而判断State就能得到当前任务的状态,根据不同状态触发不同的处理方式,比如State=1并且上面的判断没超时,就继续下一个任务判断;State=2的话就设置所有任务为停止状态,并通知界面,XX号任务超时中止.

其它的处理就与此类似了,很简单吧嘿嘿.
[解决办法]
其实你这么想,再怎么样多的下位机,都是通过一条线通讯,而一条线要能稳定处理这么多数据,也是依靠这些数据能很好的排队处理而来的,就像网络通讯,就是一个个的IP包排队处理的。所以对于数据包的处理时间、等待返回、弃包、任务队列等操作尤为重要。只要按照这个“时”、“序”的概念去弄,肯定是没错的。

热点排行