26

Re: AHK: DllCall и правильный вызов функций.

wisgest пишет:
YMP пишет:

мне не нравятся вещи вроде

, Str, str)

Мне тоже. А вот так нравится

, "Str", str)

Какие все придирчивые.

Начинающий скриптер.
По вопросам сюдой: Skype: live:ddeeeennn

27

Re: AHK: DllCall и правильный вызов функций.

MandarinKa02, это точно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

28 (изменено: Alectric, 2017-08-10 17:58:04)

Re: AHK: DllCall и правильный вызов функций.

Raven
Тоже работаю с сиеменсом, новичок в STL. К сожалению нет доступа к IP модулям чтобы "поиграться" со скриптами. Будет возможность обязательно попробую.

Raven пишет:

;а эти функции вообще не используются что ли?
PathCombine(abs, rel) {

Используется в начале при инициализации.

Raven пишет:

;а эти функции вообще не используются что ли?
BEint(ByRef Var, ByRef BE, Bytes) {
VarSetCapacity(BE, Bytes, 0)

loop, %Bytes%
{
byte := NumGet(Var, Bytes-A_Index, "UChar")
NumPut(byte, BE, A_Index-1, "UChar")

}
loop, %Bytes% {
MsgBox, % NumGet(BE, A_index - 1, "UChar")
}
}

Как я понял, BEint переворачивает данные (первый байт в конец, последний в начало) и выводит по одному байту в сообщении.
Берёт из переменной Var (может содержать сколько задашь байт) байт с конца и кладёт в переменную BE в начало, перебирая по одному байту. Видно что функция недоделанная, скорей всего использовалась для отладки.

Raven пишет:

buf := bit ;что это такое?
bufPtr := &buf

buf - номер читаемого бита, как я понял, или количество бит? Зачем там тогда area (область), значит читается какая-то область.


Функция S7_DBRead на мой взгляд практичнее - указываешь номер ДБ, откуда начать и сколько считать. Правда она тоже выглядит недописанной.

Можно увидеть твой текущий код?

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

29 (изменено: Alectric, 2017-08-10 18:18:20)

Re: AHK: DllCall и правильный вызов функций.

Всё сообразил что за area.

; S7Area
S7AreaPE := 0x81 	;Process Inputs.
S7AreaPA := 0x82 	;Process Outputs.
S7AreaMK := 0x83 	;Merkers.
S7AreaDB := 0x84 	;DB.
S7AreaCT := 0x1C 	;Counters.
S7AreaTM := 0x1D 	;Timers

Область памяти в ПЛК.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

30

Re: AHK: DllCall и правильный вызов функций.

Alectric Дык я ж эту функцию сам накорябал и пытаю ее. S7_DBRead как раз таки и требуется мне. С ней проще всего экспериментировать. Да и в контроллер лишнего не запишешь.

ret := ReadDB(obj, 110, 8, 4)
Msgbox %ret%
ReadDB(obj, db, start, size){
	VarSetCapacity(data, size, 0)
	DllCall("snap7.dll\Cli_DBRead", "UInt", obj, "Int", db, "int", start, "int", size, "str", data)
	return data
}

Я получаю с этой функции строки вида "Bkдд" "Bk{U" "BkuЗ" (4 байта (real значение в контроллере)). Я так понимаю сырые биты информации преобразуются в строку. По другому у меня никак не получилось получить данные... Не догоняю видимо я...
И вот что  чувак написал мне на гитхабе у которого я стырил изначальный код.

ReadDB returns binary data encoded in a string. Use NumGet to cast it to an integer. Also consider the Endianness. According to the official SNAP7 documentation, S7 uses Big Endian whereas "normal" computers use Little Endian. You will have to convert it manually in AHK

То есть как раз функция BEint и нужна для переворачивания байт так как в контроллерах сиеменс используется порядок байт "Big Endian".
Вообщем еще копать и копать. А на работе еще и работать иногда приходится ведь!

31 (изменено: Alectric, 2017-08-11 13:43:34)

Re: AHK: DllCall и правильный вызов функций.

Похоже на то, как я возился с КОМпортом. http://forum.script-coding.com/viewtopic.php?id=12659
Нужно воспринимать полученные данные не как текст, а как бинарные данные (он тебе так и ответил) и использовать NumGet для перевода данных в формат понятный для ahk.

 
      ; заполняем массив byte
        loop,% RS232_Bytes_Received*2
        {
          if (a_index&0x1)
          {
            bytenum:=(a_index-1)//2 ; номер байта

--------------> ; сам байт состоит из 2х символов HEX

            byte%bytenum%:=chr(numget(data,2*(a_index-1),"uchar")) . chr(numget(data,2*(a_index-1)+2,"uchar"))
          }
        }

     b7:="0x" byte7                    ; 1 байт
     i0:="0x" byte4 byte3         ; 2 байта
     w0:="0x" byte11 byte10 byte9 byte8 ; 4 байта

Зря с реала начал, начни лучше со слов или интегеров.

Полученные байты позднее можно будет разложить на нужные биты.

Raven пишет:

p7.dll\Cli_DBRead", "Ptr", obj,

Тут "Ptr" нужен.

RS232_Read(RS232_FileHandle,Data_Length,ByRef RS232_Bytes_Received)
{
  Num_Bytes:=Data_Length+Data_Length//3
  SetFormat,Integer,HEX
  VarSetCapacity(Data,Num_Bytes,0xff)
  if RS232_FileHandle
  Read_Result := DllCall("ReadFile"
       ,"ptr" , RS232_FileHandle   ; hFile
       ,"ptr"  , &Data             ; lpBuffer
       ,"Int"  , Num_Bytes        ; nNumberOfBytesToRead
       ,"ptr*", RS232_Bytes_Received   ; lpNumberOfBytesReceived
       ,"Int"  , 0)               ; lpOverlapped
  If (Read_Result != 1)
  {
    RS232_Close(RS232_FileHandle)
    COMFail=1
    return
  }
  Loop,% RS232_Bytes_Received
  {
    t:=NumGet(Data,a_index-1,"UChar")
    StringTrimLeft,t,t,2
    If (StrLen(t)=1)
      t:="0" t
    Data_HEX.=t
  }
  SetFormat,Integer,DEC
  Return Data_HEX
}

Переделал:

ReadDB(obj, db, start, size){
	VarSetCapacity(data, size, 0)
    SetFormat,Integer,HEX
	DllCall("snap7.dll\Cli_DBRead", "Ptr", obj, "Int", db, "int", start, "int", size, "ptr", &data)
    Loop,% size
    {
      t:=NumGet(Data,a_index-1,"UChar")
      StringTrimLeft,t,t,2
      If (StrLen(t)=1)
        t:="0" t
      Data_HEX.=t
    }
    SetFormat,Integer,DEC
	return Data_HEX
}

Есть вероятность что я где-то ошибся, возможно для функции библиотеки нужно все таки str:

ReadDB(obj, db, start, size){
	VarSetCapacity(data, size, 0)
    SetFormat,Integer,HEX
	DllCall("snap7.dll\Cli_DBRead", "Ptr", obj, "Int", db, "int", start, "int", size, "str", data)
    Loop,% size
    {
      t:=NumGet(Data,a_index-1,"UChar")
      StringTrimLeft,t,t,2
      If (StrLen(t)=1)
        t:="0" t
      Data_HEX.=t
    }
    SetFormat,Integer,DEC
	return Data_HEX
}
Raven пишет:

А на работе еще и работать иногда приходится ведь!

И не говори.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

32

Re: AHK: DllCall и правильный вызов функций.

Alectric Поздравляю коллега! у вас получилось то что не получалось у меня вот уже более недели
Обе функции возвращают одно и то же число. И то что я вижу в контроллере (DW#16#426AA2AB) ничем не отличается от получаемых данных(426AA2AB). Осталось придумать функции преобразования данных и можно писать свою скаду!

33 (изменено: Alectric, 2017-08-11 14:01:31)

Re: AHK: DllCall и правильный вызов функций.

Raven пишет:

свою скаду

Тоже мечтаю об этом, это же ужасно гибкие и бесплатные интерфейсы можно писать, работающие через эзернет!

Raven пишет:

  у вас получилось то что не получалось у меня вот уже более недели

Знал бы ты сколько я с КОМпортом возился.

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

PS Тему наверно лучше переименовать: AHK: Siemens S7 через Ethernet в AHK.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.