Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Передача данных с Ассемблера в UL

 Ответить Ответить Страница  123>
Автор
Сообщение
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Передача данных с Ассемблера в UL
    Опубликовано: 05 Март 2007 09:54

Помогите, кто знает !!!

Краткая предистория. У меня есть абсолютный поворотный шифратор, ECAN плата и ICOP 6050.

Я (с трудом, конечно. А кому легко?) на Ассемблере написал прграммку, которая позволяет с шифраторов (через ECAN, а иначе ни как) получать данные. Осталось, вроде бы ничего сложного, передать ети данные в UL (версия 1.04.026) для далнейшей обработки. Но как раз в этом месте и запнулся. В UL создал сетевую переменную  типа Float. Создал в своей проге процедуру открытого типа (Public) и переменную EXTRN DECSH1:Dword, в которой находится значение с шифратора. При Линковке в МАПе получаю следующее:

Start  Stop   Length Name               Class

 00000H 006AAH 006ABH SYSTEM             CODE
 006ACH 0076BH 000C0H CONST              DATA
 0076CH 00BA7H 0043CH DATA               DATA
 00BA8H 00C09H 00062H VARLIST            DATA
 00C0AH 00C0AH 00000H STORED             DATA
 00C10H 01C0FH 01000H STACK              STACK
 01C10H 01CC5H 000B6H CODE              

Error: Undefined symbol DECSH1 in module OUTM0.ASM
Program entry point at 01C1:0000
Проэкт, как не сложно догадаться, не работает.

Вопрос:Как правильно нужно объявлять переменые в Ассеблере для UltroLgica? Покажите примеры, или хотя бы алгоритм. 

Спасибо за ранее!!!

P.S.: С UL и Ассемблером познакомился в ноябре 2006. Так что орентируюсь, пока, слабо.

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 05 Март 2007 11:53

Надо лонимать, что ликуются разные модули между собой. Если так, то можно предложить такой порядок действий.
Сперва надо посмотреть какое имя на самом деле имеет интересующая переменная. То есть, до линковки  заглянуть в скомпилированный файл содержащий переменную(нампример .OBJ, если такой имеется) - к имени может быть приделан андебар ( _ underbar) а то и два, в зависимости от компилятора имена могут быть искорежены до неузнаваемости, особенно у функций.
Во вторых, порядок линковки может расставить одно имя раньше другого, до того как оно еще видно до использования. Можно тщательнее подобрать порядок линковки, но так не делают, а обычно пускают многопроходную линковку - по крайней мере два прохода, чтобы к следующему проходу все имена уже были везде видны.
Это самые общие советы по ASM-у. Ну а дальше - надо смотреть уже конкретно по месту.

С уважением, SAN

Наверх
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Март 2007 11:34

В любом из .OBJ файлов хорошо просматриваются имена переменных (кстати, ни каких андебар ( _ underbar) не нашел. Может не  туда смотрел).

Самое пречальное в том, что в "текст" UL (если конечно его так можно назвать) вставляют объектный файл Ассемблера. После чего компилируется сам проект. Логично предположить, что текст программы на ассемблере должен быть "законченым", т.е. готовым к употреблению. В Ultrologice делается ссылка на объектной файл Ассма. После выбора файла можно выбрать "открытую" процедуру (UL сам предлогает список таких процедур содеражщихся в выбранном файле).Проблема в правильности написания самой программки, а точнее в объявление открытых процедур и общих переменных. Далее пример моей проги. Где я мог ошибиться?

Dseg segment byte public 'data'
EXTRN DECSH1:byte
Dseg ends
public Begin
Code segment
Assume CS:Code, DS:Dseg
Begin proc far
push ds
push dx
push ax
push bx
push cx
mov ax,seg DECSH1
mov ds,ax
mov bx,offset ds:DECSH1
mov ax,0300h  ;| Base Address
mov dx,ax  ;|
Beg:
mov ax,00001h
call Ot
mov ax,01f80h
call Ot
mov ax,00008h
call Ot
mov ax,0100ah  ;Length Transmit Buffer
call Ot
nop
nop
mov ax,00002h  ;|
call Ot
mov ah,0
int 16h
cmp al,27
jz Exit1
mov ah,011h   ;|
call Inp
Cmp al,030h
jne Beg
mov ah,012h
call Inp
cmp al,20h
jne Beg
mov ah,015h
call Inp
mov ch,al  ;Revolution
dec ah
call Inp
mov cl,al  ;Step Ecodera
;dec ah
;call Inp
Call DecEc
jmp exit1
Ot proc      ; Process Load in Out
xchg ah,al     ;|
out dx,al     ;|
xchg ah,al     ;|
inc dx      ;|
out dx,al     ;|
dec dx      ;|
ret      ;|
Ot endp      ; End Process Load
Inp proc
xchg ah,al
out dx,al
xchg ah,al
inc dx
in al,dx
dec dx
ret
Inp endp
Exit1:
jmp Exit
DecEc proc
mov ax,cx
xor dx,dx
mov cx,02710h
div cx
xor ax,ax
mov ax,dx
xor dx,dx
mov cx,03e8h
div cx
add al,48
mov [bx],al
xor ax,ax
mov ax,dx
xor dx,dx
mov cl,064h
div cl
add al,48
mov [bx]+1,al
mov al,ah
xor ah,ah
mov cl,0ah
div cl
add al,48
add ah,48
mov [bx]+2,al
mov [bx]+3,ah
ret
DecEc endp
Exit:
pop cx
pop bx
pop ax
pop dx
pop ds
retf
begin endp
Code ends
 end Begin 

При ассемблирование данного текста ни каких ошибок не видно.

P.S. Данная программка получает данные с шифраторов и преобразует их в десятичный вид(4 знака). При небольшой модифекации данные можно получать непосредственно на монитор.

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Март 2007 12:55

Дык, обождите... А где, по замыслу, должна существовать переменная DECSH1,  в UL или в ассемблерном модуле ? Об'явление - EXTRN DECSH1:BYTE - это не содание самой переменной, а только упоминание что она где-то будет находиться в другом модуле. Если DECSH1 должна находиться в ASM-мовском модуле, то EXTRN - не надо, а присутствие этой переменной в сегменте типа PUBLIC автоматически делает её видимой из других модулей, в том числе и для проекта в UL, типа так :

Dseg SEGMENT BYTE PUBLIC 'data'
...
DECSH1:BYTE  
;без EXTRN
...
Dseg ENDS

С уважением, SAN.

 

Наверх
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Март 2007 06:19

Серьёзно??! Ща попробую.

По замыслу, вобщем то, переменая создается в Ассемблере, а её значение, в дальнейшем, обрабатывается в UL.

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
Vel_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 25 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 116
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vel_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Март 2007 06:22

Во первых для компилятора TASM.EXE переменные в UL (16 разрядном) обьявляются так:

extrn STORED_VAR:far     ; переменная - STORED (Int)

extrn KP_T9_1_VAR:far     ; переменная - KP_T9_1 (Float)

тоесть Вы в UL, в редакторе переменных, объявляете глобальные переменные с именем STORED и KP_T9_1. Все переменные в UL имеют имя - <имя переменной> & _VAR.

После объявления "удаленных" переменных Вы можете из своего .obj получить доступ к этим переменным. Но помните, что вы получаете только адрес переменной и сами должны понимать, что переменная может иметь разную длину (Bool - 1 b, Int - 2 b, Float - 4 b).

Пример шаблона подключаемого к UL модуля .obj :

; ==========================
; ¦ Объектный файл для UltraLogik 16
; ==========================

; Объединить несколько сегментов в группу,
; адресуемую с помощью одного сегментного регистра: Group
DGROUP  group _DATA,_BSS

; ===========================================
    extrn RESTORE_STATUS:far ; переменная - статус работы программы RESTORE
    extrn SAVE_STATUS:far    ; переменная - статус работы программы SAVE
    extrn STORED_VAR:far     ; переменная - контроль перекомпиляции проекта
   
; Регулятор T9_1
; переменные типа Boolean
    extrn Auto_T9_1_VAR:far     ; Упр.сигнал автомат-ручное (по True автомат)
 ; переменные типа Integer
 extrn Max_G_T9_1_VAR:far    ; Максимальное открытие заслонки (в автом.) Т9_1
 ; переменные типа Float
 extrn Zad_T9_1_VAR:far     ; Задание регулятору Т9_1
 ; ===========================================
; Сегмент _TEXT:    code
_TEXT  segment byte public 'CODE' use16
  assume cs:_TEXT
  assume ds:DGROUP
Seg_DGROUP    dw seg DGROUP


; Функция восстановления сохряняемых переменных
        public RESTOREMEM
RESTOREMEM    proc near
  
  push    ax       ; сохранить предыдущий ax в стек
  push    es       ; сохранить предыдущий es в стек
  push    si        ; сохранить предыдущий si в стек
  push    ds       ; сохранить предыдущий ds в стек
        
     mov     ds, word ptr cs:Seg_DGROUP; устанавливаем ds:DGROUP
        assume  ds:nothing


     mov     ax, word ptr ds:STORED_VAR ; получаем значение переменной STORED типа integer (глобальная)

     mov     word ptr ds:STORED_VAR, ax ; записываем значение ax в переменную STORED типа integer (глобальная)

    mov     al, byte ptr ds:Auto_T9_1_VAR ; получаем значение переменной  Auto_T9_1 в al
    mov     byte ptr ds:Auto_T9_1_VAR, 1 ; записываем в Auto_T9_1  True


    mov     word ptr ds:Zad_T9_1_VAR, ax ; записываем значение ax в младшую часть переменной Zad_T9_1 типа Float (глобальная)    

     mov     word ptr ds:Zad_T9_1_VAR+2, bx ; записываем значение bx в старшую часть переменной Zad_T9_1 типа Float (глобальная)

    mov     ax, word ptr ds:Zad_T9_1_VAR ; получаем значение  в ax младшей части переменной Zad_T9_1 типа Float (глобальная)    

     mov     bx, word ptr ds:Zad_T9_1_VAR+2 ; получаем значение в bx старшей части переменной Zad_T9_1 типа Float (глобальная)


  pop    ds       ; восстановить ds основной программы
  pop    si       ; восстановить si основной программы
  pop    es       ; восстановить es основной программы
  pop    ax       ; восстановить ax основной программы

        retn         ; вернуться в основную программу
RESTOREMEM    endp

; ---------------------------------------------------------------------------

_TEXT  ends

; ===============================
_DATA  segment word public 'DATA' use16
_DATA  ends

; ===============================
_BSS  segment word public 'BSS' use16
_BSS  ends

  end

; конец программы ===================

Компануете :

C:\Tasm\BIN\TASM.EXE *.ASM

В UL делаете:

Новая программа => Создание новой программы (заполняете поля)

Имя = <Имя программной вкладки>

Примечание = <Коментарий>

Синтаксис = EXT ( External Subroutine )

Статус = Start  ( Auto Run ) ; если не будете запускать по call

Потом на появившейся вкладке указывате путь к скомпановому .obj и в поле Public Name выбираете нужную Вам функцию из .obj.

Всё!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Vel
Наверх
Vel_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 25 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 116
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vel_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Март 2007 06:29

Да и еще, по возможности откажитесь от использования UL (версия 1.04.026), версия глюковатая.

Используйте UL .20, UL .24 или UL .28

Vel
Наверх
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Март 2007 07:21

Почти получилось . Ошибка в МАПе перестала появлятся . Правда пришлось заменить DECSH1:BYTE на DECSH1 db '    $', а иначе ошибка и файл OBJ ( на Асме) не получался. Но после запуска программа зависает, хотя должна показать (выдать) следующее сообщение:

Portions Copyright (c) 1995-2002 by CKA (UltraLogik Version 1.04)

Project: (адрес где был скомпилирован проэкт)

Из выше перечисленного можно сделать вывод: Проэк зависает не доходя до программки опроса шифраторов. В UL передача данных с одной переменной на другую делается вот так:

Где SHIF программка на Асме.OBJ, DECSH1 - переменая из SHIF. А Dec сетевая переменная на UL.

P.S. Программа пробная, поэтому такая простенькая.

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Март 2007 07:25
Первоначально опубликовано Vel_

Да и еще, по возможности откажитесь от использования UL (версия 1.04.026), версия глюковатая.

Используйте UL .20, UL .24 или UL .28

Ага, это последний проект на этой версии. Потом на UL32 переходим.

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Март 2007 17:43

Ну то-есть пока не линкуется ?
Тут наверно, надо подробнее разобраться с сегментами. Судя по выкладкам - в UL уже определены сегменты, их имена и и дальний тип данных FAR. Стало быть и в ассемблерном тексте надо соблюсти те-же имена сегментов и классов таким образом :

_DATA  SEGMENT  BYTE  PUBLIC  'DATA'  USE16
             ASSUME  DS:_DATA
             ;;
             DECSH1  DB  ?
             var_w    DW ?
             var_i     DW  ?
             ;;
_DATA  ENDS


При линковке сегменты с одинаковыми именами  _DATA  и классвми  'DATA'  из разных модулей об'единяются в общий сегмент.
Директива  ASSUME  указывает что при дальнем (FAR) обращении к данным регистр  DS  должен указывать на сегмент данных  _DATA.
Можно, правда, и явно указать дальний тип метки :

_DATA  SEGMENT  BYTE  PUBLIC  'DATA'  USE16
             ASSUME  DS:_DATA
             ;;
 DECSH1  LABEL FAR
               DB  ?
             ;;

И еще почему-то в  MAP-е видны несколько сегментов данных. Желательно все переменные расположить в одном сегменте - меньше проблем.

С уважением, SAN.

 

Наверх
 Ответить Ответить Страница  123>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz