您的位置:控制工程论坛网论坛 » 自动化软件 » 脚本语言之父--TCL(Tool Command Language)在工业自动化中的应用

winterswimer

winterswimer   |   当前状态:在线

总积分:2907  2024年可用积分:8

注册时间: 2006-08-30

最后登录时间: 2015-10-30

空间 发短消息加为好友

脚本语言之父--TCL(Tool Command Language)在工业自动化中的应用

winterswimer  发表于 2009/4/15 13:02:50      5396 查看 1 回复  [上一主题]  [下一主题]

手机阅读

软件编程的人可能对 C/C++,Java,C# 等所谓的 System Language 比较熟悉, Tcl/Tk 则属于一类被称为 “Scripting Language”,比如:VBScript,Perl,而之所以称TCL为脚本语言之父,原因如下:

1、历史悠久,国际知名。
Tcl脚本诞生于80年代初,John K. Ousterhout在加州大学伯克利分校实现的。

2、 设计规范,功能强大。
Tcl语言兼具面向过程,面向对象,函数设计等程序设计语言的特点于一身,保证了语言的灵活性和高效性。再加上设计高效灵活的TK库,成为程序设计的一个典范。能够开发跨平台的应用程序、易于编写网络应用程序、适于开发图形用户界面等。

3、Tcl是免费的。各种自动化软件嵌入Tcl没有版权的问题。

4、业界广泛应用。
Tcl语言本身简洁明快,语法简明扼要,语言本身并无复杂的技术难点,决定了Tcl学习周期短,生产效率高。在工业自动化领域,网络通讯是非常关键的,而且,设备平台操作系统越来越丰富,而Tcl可以轻松实现网络编程,同时,其跨平台,图形界面等功能,使其在工业自动化领域的设备配套、软件集成测试等方面有着很宽广的应用前景。所以,Tcl被思科,安捷伦,摩托,华为,中兴等国内外厂家广泛采用。同时,也是软件自动化测试领域的首选工具。

目前,在组态软件中,Advantech WebAccess网际组态软件Hmitech HMIBuilder分布式组态软件都内嵌Tcl脚本语言,扩展了组态软件的功能,比如HMIBuilder可以通过Tcl的管道操作指令实现串行通讯、以太网通讯和文件操作,而且,HMIBuilder带有脚本调试器,可以在线debuggerTcl脚本,是组态软件的一大特色。

  • 官方网站:www.tcl.tk
  • 流行的发行版本:www.activestate.com
  • Tcl维基:http://wiki.tcl.tk
  • Tcl-Tk中文网:http://www.tclchina.com/
  • Tcl/Tk 编程权威指南(英文版)
  • 1楼 0 0 回复
    • winterswimer

      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 debug


        set 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

      2楼 回复本楼

      引用 winterswimer 2009/4/15 13:02:50 发表于2楼的内容

    总共 , 当前 /