发表于:2003-09-16 08:41:00
楼主
中国人的z893要与德国人的CAN一较高低之八 98me所使用的[软猫]篇之2[黑猫]
z893与CAN 同属局部网,
如果它们要想与PC相联的话
z893的硬件开销要比CAN 小。
CAN 需要设计专用的板卡,
而z893仅需要一条通用的232通讯线, [市面上的大路货5元钱]
连在com1口,即可。
在软件上,
z893与CAN 都需要PC的中断支持,
否则无法通讯。
与CAN 不一样的是:
z893是目前现有的现场总线中,
实时响应要求最高的总线,
为了方便大家理解,
我们下面作个粗略地计算:
(1)假定z893与CAN 都使用115.2Kbp/s,
(2)假定串行通讯交换一个字节的协议为:[一个启始位,八个数据位,一个停止位]。
CAN 为定长帧,
最小的传输长度为10个字节,
当节点收完10个字节之后向PC发出中断请求,
只要PC在收到第2组数据之前作出响应,
就不会影响到整个系统的效率。
响应时间为:115.2K /100 =1.145K,约0.87毫秒!
z893采用非定长帧,
串行流水线方式工作。
从服务器端而言,
它是在输出7个字节的引导周期之内,
要求工作站应答5个字节,
否则就被改换到下个设备号。
问题还不仅如此,
一个有效的工作站是在收到服务器呼叫之后,
并经判明是自已的工作周期时,
才作出这种响应的。
响应要求在接下来的时间之内,
工作站应向服务器输出5个字节的指令码,
否则就会[错失良机]。
而系统仅剩6个字节的时间,
也就是说它的响应时间应小于1个字节的串行输出时间。
115.2K /10 =11.45K,约0.087毫秒!
比较两者,存有很大的差别。
别看CAN是采用的硬猫,
勿论从效率上还是从速度上都较z893技差一筹。
一般来讲,
编制CAN 的通讯程序,
要考虑的问题十分多,
不仅要考虑响应时间的问题,
而且还要考虑:
占用的问题,
等待的问题,
冲突的问题,
优先的问题,
多线程的问题,
稍欠周全就会叫你哭笑不得!
z893就完全不一样,
根本上就不存在上述问题。
z893不仅能做到在win下,
同一个[应用文件]下的不同线程
使用同一个com1口,
同一种猫,
共亨同一台服务器;
就是不同的[应用文件]下的不同线程,
使用同一个com1口,
同一种猫,
也可以共亨同一台服务器。
凡是编过大型软件的工程人员都知道,
线程间的通讯是个十分复杂的问题,
目前只能依赖于微软的API函数。
如果你对它没有[吃透],
或者是它对你保了密,
或者是来了点小动作,
就会叫你几个月也睡不着好觉。 [寻找虫子]
z893的猫,
是直接对硬件口编程,
没有使用到任何API函数,
从win95直到98me,都能兼容。
倒不是我对API有什么意见,
而是z893在研发之初,
就只有DOS操作系统,
API还在娘肚里没出世。 [开个玩笑]
现在想用,只是没有机会,
同时也[担心]它会不会变来变去,
搞得我的猫[死去活来]跟着[升级]。
有兴趣的猫迷可以将这些猫多研究一二,
说不定会大有益处。
现在了解DOS的人是一天比一天少,
我真不知道我的贴子对不对大家的胄口,
但愿不会叫大家失望。
前面谈到,
z893需要实时响应极高的中断,
微软对中断又没有公布其最精华的底层协议,
[API能不能响应得过来还得打问号!]
我又不想受制于API函数,
这种需求导致了[黑猫]的出世。
下面介绍98me所使用的[软猫]篇之2[黑猫],
专供PC[查询中断]服务使用,
详见各贴例程。
[用Delphi语言编写
[兼容Delphi2.0、3.0、4.0、5.0、7.0]
[不兼容6.0]
var
d100a: Td100a;
d1000:array[0..254] of byte; //数据库使用 z893_em
d2006:dword; //数据库使用 动态显示[高速通道1-4]
d2007:dword; //数据库使用 d=0 允许采样 1关闭
d2008:dword; //数据库使用 d=0 允许显示 1关闭
procedure b100; //数据库高速通道采样[黑猫]
{$R *.DFM}
;******************** .软猫1. ********************
//子程序
procedure b100; //数据库高速通道采样
begin
asm
cli
push eax
push ebx
push ecx
push edx
push ebp
@@100: lea ebp,d1000 //高速通道
cmp d2007,0 //d=0 允许采样
jz @@101
mov d2006,123
jmp @@rm
@@101: mov d2007,1 //d=1 禁止采样
mov d2008,1 //d=1 开报井
mov ecx,8ffffh //看门狗4ffff=2s/500MHz
@@102: mov dx,3feh //DCD检测
in al,dx
and al,80h
jnz @@103 //DCD检测↓
loop @@102 //看门狗循环
jmp @@rm
@@103: mov dx,3feh //DCD检测↑
in al,dx
and al,80h
jz @@110 //dcd ok!
loop @@103 //看门狗循环
jmp @@rm
@@110: mov dx,3fdh
in al,dx
and al,1
jnz @@111
loop @@110 //看门狗循环
jmp @@rm
@@111: mov dx,3f8h
in al,dx
mov [ebp],al //设备号
@@120: mov dx,3fdh
in al,dx
and al,1
jnz @@121
loop @@120 //看门狗循环
jmp @@rm
@@121: mov dx,3f8h
in al,dx
mov [ebp+1],al //IR指针
@@130: mov dx,3fdh
in al,dx
and al,1
jnz @@131
loop @@130 //看门狗循环
jmp @@rm
@@131: mov dx,3f8h
in al,dx
mov [ebp+2],al //IR数据
@@140: mov dx,3fdh
in al,dx
and al,1
jnz @@141
loop @@140 //看门狗循环
jmp @@rm
@@141: mov dx,3f8h
in al,dx
mov [ebp+3],al //高速通道1
@@150: mov dx,3fdh
in al,dx
and al,1
jnz @@151
loop @@150 //看门狗循环
jmp @@rm
@@151: mov dx,3f8h
in al,dx
mov [ebp+4],al //高速通道