Перейти к содержанию
    

Разобраться в TCL

Коллеги, есть среди нас разбирающиеся в довольно старом языке TCL?

Есть несколько коротких программ, написанных моим предшественником, и выполняющихся (время от времени) на стареньком компе под Линуксом.

Комп давно дышит на ладан, да и нет желания работать с Линуксом, по крайней мере, в ближайшее время.

Потому возникла задача переписать эти программы в скрипты МАТЛАБа, которые смогут выполнятся на других компьтерах, под Windows.

Но самому мне разобраться в написанном будет непросто. Я вообще не программист. Был бы рад, если бы кто помог с консультациями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задавайте вопросы, TCL очень прост и широко используется во множестве разных средств (Xilinx Vivado, Questasim, Modelsim, OpenOCD, expect и многих других).

Проблемы на мой взгляд могут быть только при использовании каких-то нестандартных библиотек, т.к. Вы не указали что используется у вас в качестве интерпретатора TCL.

PS: TCL сам по себе кросплатформенный и поэтому возможно, что Вам поможет просто установка https://www.activestate.com/products/tcl/
PPS: Если хочется совсем бесплатный вариант - ставьте среду mingw32 под Windows и запускайте tclsh под ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Даже не знаю, что используется в качестве интерпретатора...

Да, как вариант, установка на платформу Win подстрахует ситуацию, чтобы со смертью нынешнего железа всё не накрылось... Тут даже дело не в бесплатности.

Но, хочется разобраться и, при необходимости, вносить исправления/дополнения. Изучать для этого TCL... ну, не планировалось.

Вот пример программы:

Скрытый текст

#!/usr/bin/expect
# Accept data from RX-D2 receiver through serial port
# write out raw displacements in all three degrees of freedom 
# to stdout and to logfile
proc checkstring {str} {
   set sstr [split $str ,]
   set nb [llength $sstr]
   if {$nb != 5} {return 1}
   for {set i 0} {$i < $nb} {incr i} {
      if {[string length [lindex $sstr $i]] != 4} {return 2}
      if {[string is xdigit -strict [lindex $sstr $i]] != 1} {return 3}
   }
   return 0
}
proc hex2bin hex {
    set t [list 0 0000 1 0001 2 0010 3 0011 4 0100 \
    5 0101 6 0110 7 0111 8 1000 9 1001 \
    a 1010 b 1011 c 1100 d 1101 e 1110 f 1111 \
    A 1010 B 1011 C 1100 D 1101 E 1110 F 1111]
    regsub {^0[xX]} $hex {} hex
    return [string map -nocase $t $hex]
}
proc bin2dec {string} {
    set string [format %032s $string]
    binary scan [binary format B32 $string] I str
    return $str
}
trap {close $fidp; close $fido; close $fidl; puts "Program terminated successfully"; exit} {SIGINT SIGTERM}
set fidp [open /dev/ttyS0 r]
fconfigure $fidp -mode 9600,n,8,1 -handshake none -ttycontrol {RTS 0 DTR 0}
fconfigure $fidp -buffering line -encoding binary -translation cr
set sec [clock seconds]
set rawf "test_[clock format $sec -format %Y-%m%d%H%M -gmt T].raw"
set fido [open $rawf w]
set logf "test_[clock format $sec -format %Y-%m%d%H%M -gmt T].log"
set fidl [open $logf w]
puts $fidl "Buoy displacements measured during test at [clock format $sec -format %Y-%m%d%H%M -gmt T] GMT"
puts $fidl "Heave\tNorth\tWest"
while {1 < 2} {
  set length0 [gets $fidp buf0]
  if {$length0 == 24} {
    if {[checkstring $buf0] == 0} {
      set sbuf0 [split $buf0 ,]
      set sta [string range [lindex $sbuf0 0] 0 1]
      if {$sta == 00 || $sta == 01 || $sta == 04 || $sta == 05} {
        puts $fido $buf0
        flush $fido
        set hexz [string range $buf0 10 12]
        set hexn [string index $buf0 13][string range $buf0 15 16]
        set hexw [string range $buf0 17 18][string index $buf0 20]
        set z [bin2dec [string range [hex2bin $hexz] 1 11]]
        set n [bin2dec [string range [hex2bin $hexn] 1 11]]
        set w [bin2dec [string range [hex2bin $hexw] 1 11]]
        set sigz [string index [hex2bin $hexz] 0]
        set sign [string index [hex2bin $hexn] 0]
        set sigw [string index [hex2bin $hexw] 0]
        if {$sigz == 1} {set z -${z}cm} else {set z +${z}cm}
        if {$sign == 1} {set n -${n}cm} else {set n +${n}cm}
        if {$sigw == 1} {set w -${w}cm} else {set w +${w}cm}
        puts $fidl "$z\t$n\t$w"
        flush $fidl
        puts "$z\t$n\t$w"
      }
    }
  }
}

 

Кажется, это можно написать как-то проще и понятнее :)

А не существует ли на сегодня какого-то волшебного средства, генерирующего, скажем, тот же скрипт МАТЛАБа (или Питона), если скормить ему текст, написанный на TCL?

Вообще, приходит в голову, что были бы полезными эдакие трансляторы с языка на язык... Может, и есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используйте спойлер, это упрощает просмотр и чтение темы.

У Вас в качестве интерпретатора используется не чистый TCL, а expect. Это известное средство для автоматизации обмена с какой-либо консольной программой, которое позволяет выполнить в автоматическом режиме (скрипт на TCL) те же действия, которые обычно приходится делать в ручную. Поэтому это не в полной мере программа на TCL, а использование движка и языка TCL для решения задачи автоматизации.

В Вашем случае этот скрипт открывает первый последовательный порт (/dev/ttyS0), настраивает его и начинает выполнять обмен (приём данных) с каким-то железом используя текстовый протокол . См. строчку

set length0 [gets $fidp buf0]

Здесь переменной присваивается длина принятого текста (строки), а в переменную buf0 заносится сама принятая строка. Ниже идёт примитивный парсинг строки на TCL, анализ полученных данных и запись в raw-файл и в журнал.
Поскольку ActiveTcl поддерживает команды expect, то можно обойтись без переписывания всего и вся, а ограничиться изменением строк кода по открытию и настройке последовательного порта. Все остальное будет работать как и раньше.

См. https://docs.activestate.com/activetcl/8.6/tcl/TclCmd/open.html и особенно https://docs.activestate.com/activetcl/8.6/tcl/TclCmd/open.html#M51

Цитата
Windows
Valid values for fileName to open a serial port are of the form comX, where X is a number, generally from 1 to 9. A legacy form accepted as well is comX:. This notation only works for serial ports from 1 to 9. An attempt to open a serial port that does not exist or has a number greater than 9 will fail. An alternate form of opening serial ports is to use the filename //./comX, where X is any number that corresponds to a serial port.

Т.е. по большому счёту нужно изменить имя файла и всё должно заработать, при условии что Вы укажете правильный последовательный порт.

24 минуты назад, Herz сказал:

А не существует ли на сегодня какого-то волшебного средства, генерирующего, скажем, тот же скрипт МАТЛАБа (или Питона), если скормить ему текст, написанный на TCL?

Не думаю, что это кому-то было нужно. Во всяком случае я про такое не слышал и не верю, что такое есть.

24 минуты назад, Herz сказал:

Вообще, приходит в голову, что были бы полезными эдакие трансляторы с языка на язык... Может, и есть?

Попытки были, just for fun. Но страдания при запуске и попытке отладки сконвертированной программы ни в коей мере не компенсируют простоту такого преобразования. ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое! Покопаюсь дальше сам пока.

 

14 минут назад, makc сказал:

Используйте спойлер, это упрощает просмотр и чтение темы.

Да, виноват, Вы правы. Поскольку не программист, то и листинги вставлять практически не приходилось...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

I'd recommend the following reference book:

"Tcl and Tk for the absolute beginner" by Kurt Wall.

Maybe a bit outdated but worth it for a quick look and refresh. Find it readily on any "provider" (PDFbooks I'd suggest).

Tcl is found within many environment as a supporting system language tool, recently I've found the TCL capabilites in e.g. the Xilinx Vivado IDE tools to be rather good for customizing and automating, kind  of like scripts to do the tasks in the IDE, synthesis, implementation, all that without even reaching the menus of the graphical IDE as normally you'd do.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/8/2021 at 6:24 PM, makc said:

TCL сам по себе кросплатформенный и поэтому возможно, что Вам поможет просто установка https://www.activestate.com/products/tcl/

+1 когда на винде сидел именно этим пользовался)

еще что-то на Tk пробовал ваять :dash2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Принял решение о создании руководства по Cadence  на русском языке - в текущее время по Sigrity по причине того, 
что сведений в РУ сегменте нет совсем, а в англ сегменте совсем скудные сведения, что даже на офф сайте Cadence люди написали 6-8 лет назад
вопросы и до сих пор они без ответов.
Основная цель - взаимодействие всех, кто пользуется Cadence и хочет использовать скрипты (tcl, python) 
для автоматизации, облегчения и экономии времени из-за того, что ряд дибиллов из Cadence никак не могут
сделать внешнюю оболочку для людей. В настоящее время она создана дебиллами для имбицилов и извращенцев разного рода.
Язык tcl так как более краткий чем Python в написании команд и скриптов, встроенных в сам Cadence.
Прошу принять участие всех желающих, на текущий день 25.04.2024 в планах:
1. Руководство в .docx и .pdf формате на русском по командам cadence на tcl языке;
2. В excel файлах сами команды на tcl, краткое их описание и готовые мини-скрипты;
3. Скрипты;
4. Исполняемые приложения, написанные на языках программирования на выбор (я рассматриваю rust);

ссылки

https://drive.google.com/drive/folders/1jOYKGhx1ws83jrrcGSbNP0ykSEh-fj3E?usp=sharing
https://github.com/Avrimuskom/sigrity-rus

Связь со мной:
[email protected]
телега:https://t.me/Kotvsapogah77

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, avrimuskom said:

1. Руководство в .docx и .pdf формате на русском по командам cadence на tcl языке;
2. В excel файлах сами команды на tcl, краткое их описание и готовые мини-скрипты;

Вроде бы Cadence не выпускает софт под Windows. Поэтому ведение документации в форматах Necrosoft Office вызывает недоумение. Почему бы не использовать Open/LibreOffice и его родные форматы odt и ods?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 25.04.2024 в 20:15, andrew_b сказал:

Вроде бы Cadence не выпускает софт под Windows. Поэтому ведение документации в форматах Necrosoft Office вызывает недоумение. Почему бы не использовать Open/LibreOffice и его родные форматы odt и ods?

docx/xlsx - это тоже свободные форматы, которые имеют гораздо большую популярность.
К примеру это формат по умолчанию для свободного офиса c открытым исходным кодом OnlyOffice (он же Р7). Отечественный, кстати.
Там конечно тоже куча минусов, но после него я LibreOffice в жизнь использовать не буду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 25.04.2024 в 20:15, andrew_b сказал:

Вроде бы Cadence не выпускает софт под Windows. Поэтому ведение документации в форматах Necrosoft Office вызывает недоумение. Почему бы не использовать Open/LibreOffice и его родные форматы odt и ods?

 

Еще как выпускает под Windows.

Open/LibreOffice и его родные форматы odt и ods  - полностью поддерживаю, на них тоже выпускать документацию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...