Hallo Andy,
entschuldige das späte "Danke!".
Ich bin die letzte Zeit nicht dazu gekommen. Aber vielen Danke für die Tips. Wie heißt die SFTP-UDF richtig, ich finde sie nicht.
Schönes Wochenende!
Hallo Andy,
entschuldige das späte "Danke!".
Ich bin die letzte Zeit nicht dazu gekommen. Aber vielen Danke für die Tips. Wie heißt die SFTP-UDF richtig, ich finde sie nicht.
Schönes Wochenende!
Hallo,
ich versuche seit gestern per FTP eine Datei auf einen FTP-Server zu senden.
Vorab: Ich habe eine skript laufen mit einem anderen Provider - da geht es.
Die gleiche verwendete Funktion geht bei dogado als Provider nicht - es wird die Datei übertragen - leer.
Bei 1und1 funktioniert es - als Haupt-FTP-Benutzer. Ein neu angelegter benutzer geht nicht - Login Fehler.
Die Benutzer bei 1und 1 unterscheiden sich im Protokoll:
Hauptbenutzer: SFTP + SSH
Benutzer: SFTP
Der Benutzer kann sich nicht einloggen - Fehler.
Wie habt ihr das gelöst?
Danke vorab!
Die aufgeführte Funktion hat wieder keine Struktur - ist gewachsen zum Fehlerfinden. (..wenig Ahnung von der Syntax..)
Func _FTP_push()
$FTPSession = "FTPPUSH"
$File_local = $datei_name_
$File_remote = $datei_name_ftp
$OPEN = _FTP_Open("FTPPUSH")
$CONN = _FTP_Connect($OPEN, $FTPServer, $FTPBenutzer, $FTPPasswort, 1, 0, 1)
;_FTP_Connect ( $hInternetSession, $sServerName, $sUsername, $sPassword [, $iPassive = 0 [, $iServerPort = 0 [, $iService = $INTERNET_SERVICE_FTP [, $iFlags = $INTERNET_FLAG_DEFAULT [, $fuContext = 0]]]]] )
_FTP_DirSetCurrent($CONN, $FTPFolder)
MsgBox(0, "FTP", $FTPServer & ":" & $FTPBenutzer & ":" & $FTPPasswort)
ConsoleWrite("FTP " & $CONN & "local: " & $DatenPfad & $File_local & ' remote: ' & $FTPFolder & $File_remote & @LF)
$loc_ist = FileExists($DatenPfad & $File_local)
MsgBox(0, "local_ist", $loc_ist)
$fp_jani = _FTP_FilePut($CONN, $DatenPfad & $File_local, $File_remote, 2)
If Not @error Then
ConsoleWrite("_FolderPut: " & @extended & " Dateien erfolgreich übertragen" & @CRLF)
Else
ConsoleWrite("_FolderPut Fehler:" & @error & " " & @extended & @CRLF)
EndIf
ConsoleWrite("FTP jani" & $CONN & ' : ' & $fp_jani & @LF)
Sleep(100)
If @error Then
MsgBox($MB_SYSTEMMODAL, '_FTP_Connect', 'ERROR=' & @error)
Else
Local $iErr = @error, $sFTP_Message
_FTP_GetLastResponseInfo($iErr, $sFTP_Message)
ConsoleWrite('$iErr=' & $iErr & ' $sFTP_Message:' & @CRLF & $sFTP_Message & @CRLF)
; do something ...
EndIf
_FTP_Close($OPEN)
_FTP_Close($CONN)
Sleep(100)
EndFunc ;==>_FTP_push
Alles anzeigen
Edit Oscar: Code mit Tidy formatiert und hier als AutoIt-Code eingefügt.
Hallo Moombas,
danke für die Hilfe. Allerdings läuft das skript "unbeaufsichtigt", d.h. Es soll solange "schleifen" bis wieder einer den Stecker steckt - und weiter gehts.
Jetzt haab ich ein großes FTP Problem. Da mach im mal ein neues Thema.
Danke!
Vielen Tausend Dank,
..ihr seid Helden!
ja die Struktur ist vorab schon schlecht und geht bei der Fehlersuche immer komplett in den Eimer. Die global/local Variablen werde ich noch richten.
So langsam funktioniert das Auslesen. Zum Glück hatte ich "Fehler Verbindungsaufbau" daraufhin habe ich die Funktion dahin geändert, dass sie sich selber aufruft, an Stelle von exit. Fuktioniert - nur leider habe ich ein schlechtes Gefühl dabei. Kann man das so machen?
...nochmals vielen Dank!
Func _example_nativ()
;MsgBox(0, "_example_native()", "Example modbusTCP only via Autoit")
TCPStartup()
$_native_ModbusTCP_Debug_Send = 1
$_native_ModbusTCP_Debug_Recv = 1
Global $iSock = TCPConnect($S_IP, $s_port )
If $iSock = -1 Then
ConsoleWrite("Fehler Verbindungsaufbau" & @LF)
ConsoleWrite("Conn = IP: " & $S_IP &" Port: " & $s_port & " uId: " & $s_uID & " FC: " & $FC & " RegStart: " & $Start_regJanitza & " RegAnz: " & $RegAnzahl & @CRLF)
sleep(10000)
_example_nativ()
;Exit
EndIf
$aJani = _native_ModbusTCP_ReadImputRegister($iSock, $Start_regJanitza, $RegAnzahl, "float") ;Functioncode 4, Register 1, Länge 4 Resiter lesen, als float zurückgeben
ConsoleWrite("Conn = IP: " & $S_IP &" Port: " & $s_port & " uId: " & $s_uID & " FC: " & $FC & " RegStart: " & $Start_regJanitza & " RegAnz: " & $RegAnzahl & @CRLF)
ConsoleWrite("$iSock = " & $iSock & @CRLF)
;ConsoleWrite("float = " & $aJani[0] & @CRLF)
;_ArrayDisplay($aJani)
TCPShutdown()
EndFunc ;==>_example_nativ
Alles anzeigen
Danke,
genau hier lag auch der Fehler. Ich musste in der ini die Stationsnummer ($s_uID) in Anführungszeichen setzen z.B. "02" und nicht 02
Ich hatte die gesendeten Daten verglichen. Als die Kommunikation funktioniert hatte war eine "0" mehr im Sendeprotokoll. Dann hab ich geschraubt.....
Danke erst mal, ich versuche weiter zu kommen...
Grüße!
Hallo Sven,
ich habe auf dem Weg der Fehlersuche alles entfernt was nicht gebraucht wird. Deshalb auch kein Ende der While-Schleife. Das Original hat genauso nicht funktioniert und ist mittlerweile zerstört.
FTP, Listview usw. sind dann noch (wieder) vorgesehen.
Die ini lade ich mal als txt hoch.
Danke schon mal!!
Hallo,
ich bin mal wieder beim Versuch verschiedene Janitzas per Modbus auszulesen. Mein Versuch erst mal nur einen Janitza auszulesen funktioniert teilweise.
Bei manschen "Starts" bekomme ich die angefrageten Werte - bei den nächsten "Starts" ist die Antwort zu kurz und die falschen Register werden ausgelesen.
Bild "matrix_ok" zeigt einen gelungenen Versuch 64 Register (float).
Bild "matrix_falsch" zeigt einen misslungenen Versuch 64 Register (float).
Ich habe viel rumprobiert - komme aber zu keiner Lösung. Vielen Dank schon mal!
; Abfragen von Modbusstationen,
#include <WinAPI.au3>
#include <Misc.au3>
#include <Array.au3>
#include <File.au3>
#include <FTPEx.au3>
#include <Timers.au3>
#include <GUIConstants.au3>
#include <MsgBoxConstants.au3>
#include <TrayConstants.au3>
#Include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <ListviewConstants.au3>
Global $ModbusTCP_Debug_Send = 1
Global $ModbusTCP_Debug_Recv = 1
;$anzahl_stationen = 10 ;;;;; Unbedingt noch aus inia die Anzahl ermitteln
$anzahl_janitzas = 1
$FC2 = "04"
$s_uID = "02"
$s_port = 502;
$Start_regJanitza = 19000
Local $iTimeout = 5
;;;;;;;;;;;; Hier gehts los
HotKeySet("{F8}","_stopIt") ; F8 Beendet Programm
$runner = True
$hTimer = TimerInit() ; Begin the timer and store the handle in a variable.
;MsgBox($MB_SYSTEMMODAL, "Time Difference", $fDiff)
While $runner
_INI_zu_ARRAY_janitza()
TCPStartup()
For $s = 1 TO UBound($listeJan)-1 ;Anzahl Janitzas
$s_port = $listeJan[$s][2]
$s_uID = $listeJan[$s][3]
Global $iSock = TCPConnect($listeJan[$s][1], $s_port)
If $iSock = -1 Then
ConsoleWrite("Fehler Verbindungsaufbau TCP Modbus" & $listeJan[$s][1] & @LF)
;Exit
EndIf
If $iSock <> -1 Then
ConsoleWrite(" TCP Modbus OK " & $listeJan[$s][1] & @LF)
;Exit
$aWR_meter = _ModbusTCP_ReadValues($iSock, $FC2, $Start_regJanitza,64, "float") ;
_ArrayDisplay($aWR_meter)
TCPCloseSocket($iSock)
TCPShutdown()
exit
EndIf ;; Verbinugsaufbau OK
;_____________________________________________________________
NEXT ; Nächste Station
TCPCloseSocket($iSock)
sleep(Abs($timer *1000) - (_Timer_Diff($hStarttime)))
WEnd
TCPShutdown()
Exit
;;;____________________________________________FUNKTIONEN_________________________________________________________________________________;;;;;;;
Func _stopIt()
$runner = False
TCPCloseSocket($iSock)
TCPShutdown()
Exit
EndFunc
;;;;;;;;;;;;;;; INI ZU ARRAY JANITZA
Func _INI_zu_ARRAY_janitza()
Global $listeJan[$anzahl_janitzas+1][14] ;zeile, spalte
FOR $i = 1 To $anzahl_janitzas
$spalte1 = IniRead(@ScriptDir & "\janitza.ini", $i, "Janiza", "xxx") ;IP Adresse
$spalte2 = IniRead(@ScriptDir & "\janitza.ini", $i, "PORT", "xxx") ;Modbus Port
$spalte3 = IniRead(@ScriptDir & "\janitza.ini", $i, "MODBUS_ID", "xxx") ;Modbus uID
$spalte4 = IniRead(@ScriptDir & "\janitza.ini", $i, "KOPF", "xxx") ;Kopf
$spalte5 = IniRead(@ScriptDir & "\janitza.ini", $i, "ID", "xxx") ;ID
$spalte6 = IniRead(@ScriptDir & "\janitza.ini", $i, "MANUFAKTUR", "xxx") ;Hersteller
$spalte7 = IniRead(@ScriptDir & "\janitza.ini", $i, "MODEL", "xxx") ;Model
$spalte8 = IniRead(@ScriptDir & "\janitza.ini", $i, "SERIAL", "xxx") ;Sereiennummer
$spalte9 = IniRead(@ScriptDir & "\janitza.ini", $i, "NIX", "xxx") ;Sereiennummer
$spalte10 = IniRead(@ScriptDir & "\janitza.ini", $i, "FTP_HOST", "xxx") ;FTP host
$spalte11 = IniRead(@ScriptDir & "\janitza.ini", $i, "FTP_USER", "xxx") ;FTuser
$spalte12 = IniRead(@ScriptDir & "\janitza.ini", $i, "PTP_PAS", "xxx") ;FTPpa
$spalte13 = IniRead(@ScriptDir & "\janitza.ini", $i, "FTP_PFAD", "xxx") ;FT Pfad
$listeJan[$i][1] = $spalte1 ;zeile, spalte
$listeJan[$i][2] = $spalte2
$listeJan[$i][3] = $spalte3
$listeJan[$i][4] = $spalte4
$listeJan[$i][5] = $spalte5
$listeJan[$i][6] = $spalte6
$listeJan[$i][7] = $spalte7
$listeJan[$i][8] = $spalte8
$listeJan[$i][9] = $spalte9
$listeJan[$i][10] = $spalte10
$listeJan[$i][11] = $spalte11
$listeJan[$i][12] = $spalte12
$listeJan[$i][13] = $spalte13
NEXT
EndFunc
;;;;;;;;;;;;;;; ENDE INI ZU ARRAY Janitza
;;;;;;;;;;;;;FUNC MODBUS;;;;;;;;;;;;;;;;;;;;;;
Func _ModbusTCP_ReadValues($mainsocket, $FC2, $iStart, $iNum, $sType)
Local Static $TI = 0
$TI += 1
Local $iBytesToSend = 6
_ModbusTCP_Send($mainsocket, "0x" & Hex($TI, 4) & "0000" & Hex($iBytesToSend, 5) & $s_uID & Hex($FC2, 2) & Hex($iStart, 4) & Hex($iNum, 4)) ;; komisch Hex($iBytesToSend, 4) ist sonst OK
;_ModbusTCP_Send($mainsocket, "0x" & Hex($__TID, 4) & "0000" & Hex($iBytesToSend, 4) & $ID & Hex($FC, 2) & Hex($iStart, 4) & Hex($iNum, 4))
MsgBox(0, "", "$iSock: "& $iSock & ' IP: ' &$listeJan[$s][1] &' uID: '& $s_uID &' Port: '& $s_port &' FC: '& $FC2 &' Reg: '& $Start_regJanitza &' iNum: '& $iNum)
If @error Then Return SetError(1, 0, 0)
Local $sRecv
Do
$sRecv = _ModbusTCP_Recv($mainsocket, 512)
;MsgBox(0, "", "FEHLER: "& "**" & 'local : ' & $sRecv & ' FC : '& $FC2)
Until @error Or $sRecv <> ""
If @error Then Return SetError(2, 0, 0)
If Int(String(BinaryMid($sRecv, 1, 2))) <> $TI Then Return SetError(3, 0, 0)
Local $iSize = 4 ; default
Switch $sType
Case "word"
$iSize = 2
Case "float"
$iSize = 4
Case "double"
$iSize = 8
EndSwitch
Local $aRet[$iNum / ($iSize / 2)], $iTemp ;$iSize
For $i = 0 To UBound($aRet) - 1
$iTemp = BinaryMid($sRecv, 10 + $i * $iSize, $iSize)
Switch $sType
Case "word"
$aRet[$i] = Int(String($iTemp))
Case "float"
$aRet[$i] = _WinAPI_IntToFloat(Int(String($iTemp)))
Case "double"
$aRet[$i] = _WinAPI_Int64ToDouble(Int(String($iTemp)))
EndSwitch
Next
Return $aRet
EndFunc ;==>_ModbusTCP_ReadValues
Func _ModbusTCP_Send($mainsocket, $data)
If $ModbusTCP_Debug_Send Then ConsoleWrite("_ModbusTCP_Send(" & $mainsocket & ", """ & $data & """)" & @CRLF)
;$TextZeile_log = $TextZeile_log & "_ModbusTCP_Send(" & $mainsocket & ", """ & $data & """)" & @CRLF
Local $Send = TCPSend($mainsocket, $data)
Return SetError(@error, 0, $Send)
EndFunc ;==>_ModbusTCP_Send
Func _ModbusTCP_Recv($mainsocket, $maxlen = 256, $flag = 0)
Local $sRecv = TCPRecv($mainsocket, $maxlen, $flag)
Local $error = @error
If $sRecv <> "" And $ModbusTCP_Debug_Recv Then ConsoleWrite("_ModbusTCP_Recv: " & $sRecv & @CRLF)
;$TextZeile_log = $TextZeile_log & "_ModbusTCP_Recv: " & $sRecv & @CRLF
Return SetError($error, 0, $sRecv)
EndFunc ;==>_ModbusTCP_Recv
; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_Int64ToDouble
; Description ...: Returns a 8 byte integer as a double value
; Syntax.........: _WinAPI_IntToFloat($iInt64)
; Parameters ....: $iInt64 - 8 byte Integer value (64 bit)
; Return values .: Success - 8 byte integer value as a double
; Author ........: funkey
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _WinAPI_Int64ToDouble($iInt64)
Local $tInt64 = DllStructCreate("INT64")
Local $tDouble = DllStructCreate("double", DllStructGetPtr($tInt64))
DllStructSetData($tInt64, 1, $iInt64)
Return DllStructGetData($tDouble, 1)
EndFunc ;==>_WinAPI_Int64ToDouble
; #FUNCTION# ====================================================================================================================
; Name...........: UAS E`WEB https://www.autoitscript.com/forum/topic/49435-lparam-array/?tab=comments#comment-373039
; Description ...: WORD zu Dword
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; E
$iWord = MakeWord(0x34,0x12)
ConsoleWrite("0x" & Hex($iWord) & @CRLF)
ConsoleWrite("0x" & Hex(LoByte($iWord)) & @CRLF);These output original values passed to MakeWord()
ConsoleWrite("0x" & Hex(HiByte($iWord)) & @CRLF)
;$TextZeile_log = $TextZeile_log & "0x" & Hex($iWord) & @CRLF
Func LoByte($iWord)
Return BitAND($iWord, 0xFF)
EndFunc ;==>LoByte
Func HiByte($iWord)
Return BitAND($iWord, 0xFF00) / 0x100
EndFunc ;==>HiByte
Func MakeWord($iLoByte, $iHiByte)
If $iHiByte < 0x80 Then
Return BitOR($iHiByte * 0x100, $iLoByte)
Else
Return BitOR($iHiByte, 0xFF00) * BitOR(0x100, $iLoByte)
EndIf
EndFunc ;==>MakeWord
Alles anzeigen
Hallo,
habe es inzwischen anders lösen müssen. Habe eine SPS - diese fragt die Geräte mit unterscheidleicher ID ab. Die SPS lese ich dann aus. Funktioniert - gefällt mir aber nicht.
Den Original-Code habe ich schon gelöscht - sah aber so ungefähr aus:
$Start_regJanitza = 19000
TCPStartup()
_INI_zu_ARRAY() ;;;IP adressen, FTP usw aus xx.ini auslesen
_ArrayDisplay($liste1)
For $s = 1 TO UBound($liste1)-1 ;Anzahl Janitza 1- 4
Global $iSock = TCPConnect($liste1[$s][1], 502) ;;; Aus Ini die IP _ Array - Spalte 1
$aWR_janitza = _ModbusTCP_ReadValues($iSock, 4, $Start_regJanitza, 80, "float") ;
_ArrayDisplay($aWR_janitza)
NEXT ; Nächste Station
TCPCloseSocket($iSock)
Alles anzeigen
Für einen Tip bzg. der SlaveID bin ich aber sehr dankbar.
Grüße!!
danke für die Antwort.
Aber die Geräte kann ich nicht ändern - sind extern und dürfen nur ausgelesen werden. Auf die Vorgaben habe ich als keinen Einfluß.
Z.B. sind bei manchen Geräten (Parkregler) angeschlossenen Sensoren auf der geleichen IP aber mit einer anderen ID zu finden.
Grüße!
Hallo,
ich habe nun einige Modbus TCP- Kommunikationen zum laufen gebracht. d.h. ich kann z.B. einen Janitza UMG 604 auslesen.
Probleme ergenben sich, wenn die ID nicht "1"ist.
Ich nutze: TCPConnect(192.168.1.1, 502) zum ersten Janitza (ID 1)
Ich nutze: TCPConnect(192.168.1.2, 502) zum zweiten Janitza (ID 2)
Der zweite Janitza hat aber die ID 2
hier geht dann gar nichts mehr - Skript bleibt hängen.
Gibt es eine Möglichekeit die Mosbus-ID mit einzustellen?
Danke schon mal!
Danke progandy!
#Include <GuiButton.au3>
Run("calc")
WinWaitActive("Rechner")
$hWnd = ControlGetHandle("Rechner","","Button42")
If $hWnd = 0 Then ;Standardansicht
$hWnd = ControlGetHandle("Rechner","","Button5")
If $hWnd = 0 Then Exit
EndIf
Do
Sleep(10)
$x = (BitAND(_GUICtrlButton_GetState($hWnd),$BST_PUSHED)==$BST_PUSHED)
Until $x
MsgBox(0, '', "Nummer 7 im Rechner gedrückt")
Alles anzeigen
Hallo,
hab schon ganz viel gelesen. Ich kann auch den Inhalt und die Farbe des Buttons rausfinden - nur nicht ob er gedrückt wurde.
ich suche aber nochmal!
Hallo,
Wenn ich meine eigenen Dialogboxen verwende ist das Auwerten "welcher Knopf gedrückt" nicht sonderlich schwer. Wie funktioniert das aber bei fremden Fenstern? Ich habe hier ein "Bild öffnen" - Dialog mit OK ("Button1"), Abbruch ("Button2"), Neu ("Button3"). Wenn nun Abbruch gedrückt wird soll mein eigentliches Skript Starten.
aber ich hab mich irgendwie verlaufen....
danke schon mal!
Danke,
klappt natürlich. Wenn man ein Makro in VBA aufzeichnet, muss mann die meisten msAttribute in $maAttribute umwandeln.
Danke an Alle!
...gibts da ein kleines Beispiel oder Beschreibung. Ich finde die RichTextBox nicht.
Die andere Textbox fügt sich schon nicht ein.
grüße!
Danke,
wenn mans richtig versteht - wirklich gut!
Aber ich habe noch ein kleines Problem mit dem erstellen einse Textfeldes in Excel.
Ich habe (Danke für den Tip) ein Makro aufgezeichnet und es versucht für autoit aufzubereiten. Irgend etwas stimmt aber noch nicht:
#Include <Excel.au3>
#include <Date.au3>
Global $Zxlsdir= "B:\autoskript\test\Test.xls";FileOpenDialog("Zieltabelle auswählen", @ScriptDir, "*.xls (*Test*.xls)")
$oExcel_Q = _ExcelBookOpen($Zxlsdir)
$oExcel_Q.Visible = true
$oExcel_Q.ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 83, 18, 124, 72).Select
$oExcel_Q.ActiveSheet.Selection.Characters.Text = "HAllo"
With $oExcel_Q.Selection.Characters(1, 6).Font
.Name = "Arial"
.FontStyle = "Standard"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.ColorIndex = 3
End With
Alles anzeigen
Gehört nicht agnz hier rein - Text soll aber auch formatiert werden.
Danke !
Danke auch!
schwerer Stoff - werd mich bemühen.
Ich habe das so verstanden, dass ich immer nur nach dem Schreiben formatieren kann. Das ist schwierig, da ja auch mal ein "X" oder "POQ" stehen kann und ich die Zeichanzahl nicht weiß.
Kann ich die Attribute beim schreiben auch gleich mitgeben?
..cells($i,$y).Value= "XX" (fett, Arial, schwarz, Größe 12); & " "& "1" (TimesNew, rot, Größe 10)
schönes WE
Tausend Dank!
wo findet man die Refernz z.B. .Characters ?
in der Autoit Hilfe nicht.
Grüße!
da ich beides nicht gut kann würde ich leiber Autoit nehmen
Hallo,
ich habe ein Problem mit dem Zusammenführen von Zellen und möchte wissen ob (und wie) das in Autoit möglich ist.
zum Problem:
Ich habe ein Tabellenblatt mit zwei Spalten A,B
in Spalte A (Zeile 1) steht: XX
in Spalte B (Zeile 1) steht: 1
das soll jetzt in eine Zelle in ein anderes Blatt, IN EINE ZELLE gepackt werden. Aber:
"XX" (fett, Arial, schwarz, Größe 12); Leerzeichen;"1" (TimesNew, rot, Größe 10)
so in etwa:
XX 1
geht das oder muss ich VBA bemühen?
schon mal Danke!
autoit_dau