发表于:2003-09-11 15:09:00
楼主
CAN总线的推出实在是太心急了,
就象一个早产儿存在着许多先天性不足。[我可能说过头了,对不起!]
(1)按照CAN1.0标准初意,定义了11位标志符,
允许2032个标识,照说应该是很多了,
没想到在实际运用中[特别是稍为复杂的应用]不够用,
问题又出在它是定长帧,没有空间让它扩展。
CAN2.0将11位标志符扩展到29位,
这就注定了凡是采用1.0的产品将不可能升级或者是很难升级,
要警惕这种产品,小心没有备件啊。
CAN总线采用29位之后,
固然解决了标志符问题,
但是它是以降低有效的数据传输速度换来的,
是好是坏只有等待市场来回答。
(2)按照CAN标准,其有效的数据为8字节,
如果仅用于传感器类采集数据,问题不大,甚至可以说非常好!
如果用于信息交换,则会效率太差,
再加上它的工作方式属单工或半双工,可以夸大点说是个低能儿。
千万不要应用错方向,否则即既浪废财力又浪废精力。
(3)采用专用芯片组网,
固然保证了厂方的利益,
但消费者要冒不能升级或者是很难升级的风险,
特别是耐消费品必须要小心。
如果CAN总线迟推一点走向市场,
这些问题应该是可以找到一个解决办法的,怪就怪它实在是太心急了!
emdos服务器是目前世界上结构最简单的服务器,
也是体积最小的服务器,
并终有一天会集成相当于一个14脚TTL芯片大小,
(51.CPU+8KRAM)按现有的技术已经能办得到,
只是一个价格问题和市场问题.
与CAN不一样的是,虽然z893_emdos指令容量为256个,
但它仅设计了9条通用指令,这就为以后的扩展备足了余地。
3条[块指令],
3条[字节指令],
3条[位指令]。
[01][H][L][块长度] [RD 读] [HL读] [块指令]
[02][H][L][块长度] [WR 写] [写HL] [块指令]
[03][H][L][块长度] [XCH 交换] [IN交换HL] [块指令]
[04][H][L][块长度] [ADD 加] [HL加D] [字节指令]
[05][H][L][块长度] [SUB 减] [HL减D] [字节指令]
[06][H][L][块长度] [CLR 清除] [HL置0] [字节指令]
[07][H][L][D] [OFF 关] [HL按D置0] [位指令]
[08][H][L][D] [ON 开] [HL按D置1] [位指令]
[09][H][L][D] [CPL求反] [HL按D置/] [位指令]
为了加深对它的理解,我们下面结合一个实例看看,
假定某[老总]根据工程要求,派有这样一个设计:
需要通过PC显示屏上的一个按扭,
去控制100米以外的一台电机。
***********************************************
软件工程师接到这个任务之后,他将按下列流程编程:
(1)约定电机的i/o口地址=100h单元的d0,
(2)约定d0=0为关,d0=1为开,
(3)当按扭打开后执行下面程序之一即可:[注]win98me
用Delphi5.0_汇编语言编写的这段程序。
asm
lea ebp, d1300
mov al,08h
mov [ebp+1],al //操作码=08h开
mov al,01h
mov [ebp+2],al //地址H=01h
mov al,00h
mov [ebp+3],al //地址L=00h
mov al,01h
mov [ebp+4],al //D=0000 0001 位操作码
mov al,00h
mov [ebp+5],al //in:长度
mov al,00h
mov [ebp+6],al //out:长度
call a100 //[注]软猫子程序:启动交换,置电机开.
end;
用高级语言编写的这段程序。
d1300[1]:=08h; //操作码=08h开
d1300[2]:=01h; //地址H=01h
d1300[3]:=00h; //地址L=00h
d1300[4]:=01h; //D=0000 0001 位操作码
d1300[5]:=00h; //in:长度
d1300[6]:=00h; //out:长度
a100; //[注]软猫子程序:启动交换,置电机开.
***********************************************
硬件工程师接到这个任务之后,他将按下列流程编程:
(1)约定电机执行的cpu模块为51系列的ADUC812单片机,
(2)约定P1口的D3为电机控制端,
(3)约定D3=1为关,D3=0为开, [我有意设定与软件工程师不一样]
下面用ICExplorer.51汇编语言编写这段程序:
[注]A/DUC812在win98me下编程,COM1口远程直接下载,不要编程器。
MOV 71H, #01H ;[地址H]=01H
MOV 72H, #00H ;[地址L]=00H
MOV 73H, #01H ;[长度D]=1
MOV 74H, #01H ;[IN 长度]=1
MOV 75H, #00H ;[OUT长度]
MOV 76H, #38H ;[IN 指针]=38H
MOV 77H, #00H ;[OUT指针]
MOV 70H, #02H ;[操作码]=02读 [注]当软猫检测到70H<>0 时,自动启动交换.
em001:
MOV A, 70H
JNZ em001 ;[等待70H=0] [注]执行取0100H地址的数据.
当指令运行到此地时,寄存器38H里已经存有PC发出的指令[xxxx xxx1]or[xxxx xxx0]。
MOV A, 38H
ANL A, #01H
JZ em002 ;解读软件工程师的信号=0
JNZ em003 ;解读软件工程师的信号=1
执行真正的开关:
em002:
ORL P1, #008H ;[P1.D3]置1关电机.
RET
em003:
ANL P1, #0F7H ;[P1.D3]置0开电机.
RET
***********************************************
比较以上例程不难发现,勿论采用何种语言,
emdos编程仅仅是个[贴字软件],
不仅非常简单,
而且在整个项目开发中:
(1)软件工程师是采用何种算法置电机开或者是关,
他不需要对硬件工程师加以说明;
(2)硬件工程师采用单片机还是采用PLC执行真正的开或者是关,
他也不需要向软件工程师频频通报。
双方都具有相对的兼容性和灵活性。
如果用CAN,或者其它的方式来实现,恐怕就要复杂多了。
在一个实际的工程中,
修改总是经常的,
软硬分家会极大地降低工程费用。
[后续] 米d. QQ158326068