Тема: AHK: DllCall и правильный вызов функций.
Добрый день, форумчане. Работаю АСУшником. Программирую контроллеры SIEMENS. Наткнулся на библиотеку snap7.dll которая подключается и читает данные в DB контроллера, состояние контроллера и т.д. Только вот как правильно вызывать эту библиотеку через DllCall я так и не понял. Я даже нашел на Гитхабе чью то функцию с примером работы данной дллки. Но все так же не могу понять некоторые моменты данной программы. Как же дописать нужные вызовы DllCall в функции? Помогите хотя бы разобраться в этих скриптах с вызовами.
S7.ahk
g_lastError := 0
; S7Area
S7AreaPE := 0x81 ;Process Inputs.
S7AreaPA := 0x82 ;Process Outputs.
S7AreaMK := 0x83 ;Merkers.
S7AreaDB := 0x84 ;DB.
S7AreaCT := 0x1C ;Counters.
S7AreaTM := 0x1D ;Timers
; S7WordLength
S7WordLengthBit := 0x01
S7WordLengthByte := 0x02
S7WordLengthWord := 0x04
S7WordLengthDword := 0x06
S7WordLengthReal := 0x08
S7WordLengthCounter := 0x1C
S7WordLengthTimer := 0x1D
; Initialisierung
hModule := DllCall("LoadLibrary", Str, PathCombine(A_ScriptDir, "snap7.dll"))
if(hModule == -1 || hModule == 0) {
MsgBox, 48, Error, Библиотека snap7.dll не найдена
ExitApp
}
S7_Create_func := DllCall("GetProcAddress", "UInt", hModule, "Str", "Cli_Create")
S7_Create() {
global S7_Create_func
return DllCall(S7_Create_func)
}
S7_ConnectTo_func := DllCall("GetProcAddress", "UInt", hModule, "Str", "Cli_ConnectTo")
S7_ConnectTo(obj, ip, rack, slot) {
global S7_ConnectTo_func
return execute(DllCall(S7_ConnectTo_func, "uint", obj, "str", ip, "int", rack, "int", slot))
}
S7_ReadArea_func := DllCall("GetProcAddress", "UInt", hModule, "Str", "Cli_ReadArea")
S7_ReadBit(obj, area, db, offset, bitOffset, bit) {
global S7_ReadArea_func, S7WordLengthBit
buf := bit ;что это такое?
bufPtr := &buf
MsgBox, %bufPtr%
return execute(DllCall(S7_ReadArea_func, "UInt", obj, "Int", area, "Int", db, "Int", offset * 8 + bitOffset, "Int", 1, "Int", S7WordLengthBit, "Ptr", &bufPtr))
}
/*
S7_DBRead_func := DllCall("GetProcAddress", "UInt", hModule, "Str", "Cli_DBRead")
S7_DBRead(obj, db, start, size) {
global S7_DVRead_func, S7WordLengtByte
buf := byte
bufPtr := &buf
MsgBox %bufPtr%
return execute(dllcall(S7_DBRead_func, "Uint", obj, "Int", db, "Int", start, "Int", size, "Ptr", &bufPtr))
}
*/
S7_WriteArea_func := DllCall("GetProcAddress", "UInt", hModule, "Str", "Cli_WriteArea")
S7_WriteBit(obj, area, db, offset, bitOffset, bit) {
global S7_WriteArea_func, S7WordLengthBit
buf := bit
bufPtr := &buf
MsgBox, %bufPtr%
return execute(DllCall(S7_WriteArea_func, "UInt", obj, "Int", area, "Int", db, "Int", offset * 8 + bitOffset, "Int", 1, "Int", S7WordLengthBit, "Ptr", &bufPtr))
}
;а эти функции вообще не используются что ли?
PathCombine(abs, rel) {
VarSetCapacity(dest, (A_IsUnicode ? 2 : 1) * 260, 1) ; MAX_PATH
DllCall("Shlwapi.dll\PathCombine", "UInt", &dest, "UInt", &abs, "UInt", &rel)
Return, dest
}
;а эти функции вообще не используются что ли?
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")
}
}
execute(retn) {
global g_lastError
if(retn) {
g_lastError = retn
}
return (retn == 0)
}
S7_GetLastError() {
global g_lastError
err := g_lastError
g_lastError := 0
return err
}
example.ahk
#SingleInstance, Force
#Include S7.ahk
obj := S7_Create()
ret := S7_ConnectTo(obj, "192.168.1.12", 0, 3) ;(Объект соединения,IP адрес, Рэк, Слот)
MsgBox %ret%
ret := S7_ReadBit(obj, 0x83, 0, 0, 1, 1) ;(obj, area, db, offset, bitOffset, bit)
error := S7_GetLastError()
MsgBox %ret% `n%error%
;~ result := S7_DBRead(obj, 14, 0, 20)
;~ MsgBox %result%
return