-
-
winterswimer | 当前状态:在线
总积分:2907 2024年可用积分:8
注册时间: 2006-08-30
最后登录时间: 2015-10-30
-
脚本语言之父--TCL(Tool Command Language)在工业自动化中的应用
winterswimer 发表于 2009/4/15 13:02:50 5397 查看 1 回复 [上一主题] [下一主题]
手机阅读
软件编程的人可能对 C/C++,Java,C# 等所谓的 System Language 比较熟悉, Tcl/Tk 则属于一类被称为 “Scripting Language”,比如:VBScript,Perl,而之所以称TCL为脚本语言之父,原因如下:
1、历史悠久,国际知名。
Tcl脚本诞生于80年代初,John K. Ousterhout在加州大学伯克利分校实现的。
3、Tcl是免费的。各种自动化软件嵌入Tcl没有版权的问题。
4、业界广泛应用。
Tcl语言本身简洁明快,语法简明扼要,语言本身并无复杂的技术难点,决定了Tcl学习周期短,生产效率高。在工业自动化领域,网络通讯是非常关键的,而且,设备平台操作系统越来越丰富,而Tcl可以轻松实现网络编程,同时,其跨平台,图形界面等功能,使其在工业自动化领域的设备配套、软件集成测试等方面有着很宽广的应用前景。所以,Tcl被思科,安捷伦,摩托,华为,中兴等国内外厂家广泛采用。同时,也是软件自动化测试领域的首选工具。
目前,在组态软件中,Advantech WebAccess网际组态软件、Hmitech HMIBuilder分布式组态软件都内嵌Tcl脚本语言,扩展了组态软件的功能,比如HMIBuilder可以通过Tcl的管道操作指令实现串行通讯、以太网通讯和文件操作,而且,HMIBuilder带有脚本调试器,可以在线debuggerTcl脚本,是组态软件的一大特色。
-
-
-
winterswimer | 当前状态:在线
总积分:2907 2024年可用积分:8
注册时间: 2006-08-30
最后登录时间: 2015-10-30
-
winterswimer 发表于 2009/4/15 13:02:50
HMIBuilder内嵌TK/Tcl83标准库,尤其是HMIBuilder通用版全面支持TCL语言,下面是我们在HMIBuilder基础上的各种应用测试,希望对大家有所帮助。
注意:对已HMIBuilder嵌入版,由于平台兼容性问题,有些Tcl命令没有移植,比如文件操作!下面脚本都在通用版中测试通过。
Tcl脚本串口操作测试(HMIBuilder通用版支持,嵌入版目前不支持!)#配置串口
#-------------------------------------------------------------------------------#
proc ComSetup {ComPort ComRate} {
set iChannel [open $ComPort w+]
set rate $ComRate
fconfigure $iChannel -mode $ComRate,n,8,1
fconfigure $iChannel -blocking 0
fconfigure $iChannel -buffering none
fileevent $iChannel readable ""
return $iChannel
}#-------------------------------------------------------------------------------#
# 读取数据
#-------------------------------------------------------------------------------#
proc GetData {iChannel} {
global output
update
after 2000
set cap [read -nonewline $iChannel]
return "$cap"
}
#-------------------------------------------------------------------------------#
# 发送数据
#-------------------------------------------------------------------------------#
proc SendCmd {channel command} {
global output debugset letter_delay 10
set commandlen [string length $command]
for {set i 0} {$i < $commandlen} {incr i} {
set letter [string index $command $i]
after $letter_delay
puts -nonewline $channel $letter
#if {$debug(dutConfig) == 1} {puts -nonewline $output "$letter"}
}
after $letter_delay
puts -nonewline $channel "\n"
#if {$debug(dutConfig) == 1} {puts $output ""}
after 500
flush $channel
}
#-------------------------------------------------------------------------------#
# 测试代码
#-------------------------------------------------------------------------------#set com "com6" ;
set channelRate 9600;
#close $channelId
set channelId [ComSetup $com $channelRate]
set buffer "test by dlh"
SendCmd $channelId $buffer;
sleep 50000
set data [GetData $channelId]
messagebox "Get" $data
进制的转换#d 十进制 o 八进制 x 十六进制 X 十六进制大写
set age 10
set msg [format "%X" $age];
set msg [format "%x" $age];
set msg [format "%o" $age];
set msg [format "%d" $age];#10进制数转换为2进制16位显示
proc dec2bin {dec change} {
set bin ""
set a 1
while {$a>0} {
set a [expr $dec/$change]
set b [expr $dec%$change]
set dec $a
set bin $b$bin
}
set len [string length $bin]
#如果8位显示,请修改16为8
if {$len < 16 } {
#如果8位显示,请修改16为8
for {set i 0} {$i<[expr 16-$len]} {incr i} {
set bin 0$bin
}
}
return $bin
}set sss [ dec2bin 16 2]
set_edit_text "ObjID" $sss
引用 winterswimer 2009/4/15 13:02:50 发表于2楼的内容
-