1

Тема: AHK: запуск консоли в фоновом режиме

Доброго времени суток.

Задача: достучатся до сети ModBus из AHK . Нашел консольное приложение modpoll, пример кода - из Help'a AHK. Вызываю modpoll из скрипта с перехватом StdOut, все работает.

Код AHK:


String = " C:\Users\HP\Desktop\Log\win\modpoll -b 9600 -p none -s 1 -m tcp -o 3 -t 3:float -a 10 -r 256 -c 1 -1 192.168.10.245 "
CommandLine = %ComSpec% /c %String%

shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(CommandLine) 
Result := exec.StdOut.ReadAll()

Вопрос в том, как добиться, чтобы консоль запускалась в фоновом режиме и не докучала выскакивающим окном?

2

Re: AHK: запуск консоли в фоновом режиме

Не в курсе, что такое ModBus и modpoll, но можно попробовать так запустить:

MsgBox, % CmdRet(CommandLine)

CmdRet(sCmd, callBackFuncObj := "", encoding := "CP866")
{
   static HANDLE_FLAG_INHERIT := 0x00000001, flags := HANDLE_FLAG_INHERIT
        , STARTF_USESTDHANDLES := 0x100, CREATE_NO_WINDOW := 0x08000000
   
   DllCall("CreatePipe", "PtrP", hPipeRead, "PtrP", hPipeWrite, "Ptr", 0, "UInt", 0)
   DllCall("SetHandleInformation", "Ptr", hPipeWrite, "UInt", flags, "UInt", HANDLE_FLAG_INHERIT)
   
   VarSetCapacity(STARTUPINFO , siSize :=    A_PtrSize*4 + 4*8 + A_PtrSize*5, 0)
   NumPut(siSize              , STARTUPINFO)
   NumPut(STARTF_USESTDHANDLES, STARTUPINFO, A_PtrSize*4 + 4*7)
   NumPut(hPipeWrite          , STARTUPINFO, A_PtrSize*4 + 4*8 + A_PtrSize*3)
   NumPut(hPipeWrite          , STARTUPINFO, A_PtrSize*4 + 4*8 + A_PtrSize*4)
   
   VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 4*2, 0)

   if !DllCall("CreateProcess", "UInt", 0, "Str", sCmd, "UInt", 0, "UInt", 0, "UInt", true, "UInt", CREATE_NO_WINDOW
                              , "UInt", 0, "UInt", 0, "Ptr", &STARTUPINFO, "Ptr", &PROCESS_INFORMATION)
   {
      DllCall("CloseHandle", "Ptr", hPipeRead)
      DllCall("CloseHandle", "Ptr", hPipeWrite)
      throw Exception("CreateProcess is failed")
   }
   DllCall("CloseHandle", "Ptr", hPipeWrite)
   VarSetCapacity(sTemp, 4096), nSize := 0
   while DllCall("ReadFile", "Ptr", hPipeRead, "Ptr", &sTemp, "UInt", 4096, "UIntP", nSize, "UInt", 0) {
      sOutput .= stdOut := StrGet(&sTemp, nSize, encoding)
      ( callBackFuncObj && callBackFuncObj.Call(stdOut) )
   }
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION))
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION, A_PtrSize))
   DllCall("CloseHandle", "Ptr", hPipeRead)
   Return sOutput
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: запуск консоли в фоновом режиме

Спасибо,  работает.

Modbus - это протокол коммуникаци оборудования над RS-485, по архитектуре Master/Slave. В основном используется в промышленности, но и в умных домах тоже.
Modpoll - comand line утилита для Modbus. Единственное, что пока нашел свободного и совместимого с АНК.

4

Re: AHK: запуск консоли в фоновом режиме

Доброго времени суток.

Протестировал утилиту modpol v3.6, https://www.modbusdriver.com/modpoll.html. Может, кому будет интересно.

В принципе, неплохая попытка привести коммуникацию с Modbus устройствами в более удобоваримый вид и легко прикручивается к AHK, но пока сыровата. Некорректно работают некоторые функции (это до чего докопался, может еще что-то есть):

1) Некорректно обрабатываются ответы от Slave типа float32. Конкретно, точность ответа modpoll отличается от точности наладочных программ. Пример, показания счетчика электроэнергии, полученные через modpoll и другими программами: 188 и 188.8475 соответственно. Вероятно, при увеличении показаний точность будет еще уменьшатся. Конечно, в принципе можно получать ответы в шестнадцатеричном виде и конвертировать самому...

2) Утилита коряво работает с записью в регистры, то есть лишь ограниченно пригодна для управления исполнительными устройствами. Запись почти не документирована. На проверку оказалось, что утилита поддерживает только функцию 10 (write multiple coils) но не поддерживает 5 (write single coil).

3) Утилита не работает под WinXP (Not valid win32 application).

В общем, утилита на данный момент пригодна для опроса датчиков, с учетом изложенного в п.1. Однако все,  что выходит за пределы 4 стандартных функций Modbus, ей не под силу.