Verbindung mit Python-LibNoDave und einer Siemens Logo 0BA7

Um mittels Python eine Verbindung zu einer Siemens LOGO! 0BA7 herstellen zu können, sind einige Schritte erforderlich. Ich persönlich habe diese unter Linux (Debian) durchgeführt. Später soll dies alles auf einem Raspberry PI (oder ähnliches Board) ebenfalls lauffähig sein.
Prinzipiell ist es allerdings bei der Verwendung von Python und LibNoDave egal, welches OS verwendet wird. Also nun zum eingemachten.

LibNoDave und Python-LibNoDave heruntergeladen und von den Quellen kompilliert*. Mit folgendem Beispiel-Coding kann man eine erste Verbindung zur LOGO! herstellen.

from libnodave import *

dave = libnodave()
# IP-Adresse der LOGO - Port ist immer 102
dave.open_socket('10.173.24.100', 102)
# Default-Werte (geklaut aus dem Demo-Programm)
dave.new_interface('IF1', daveProtoMPI, daveProtoISOTCP, daveSpeed187k)
# Timeout-Wert von 10 Sekunden? Doku ist das halbe Leben... 🙂
dave.set_timeout(10)
# Verbindung zur CPU aufbauen, MPI, Rack = 1, Slot = 0 (LOGO benötigt genau diese Werte)
dave.connect_plc(2, 1, 0)
# Aktuellen Wert des ersten Ausgangs (Q1) lesen 
print('output Q1 value %s' % dave.get_output_byte(0)) 
# Verbindung wieder schliessen - es kann nur eine offene Verbindung geben
dave.disconnect()

Hoffe es hilft jemanden – habe mir diese paar Zeilen Quelltext selbst mühsam aus dem wirren C-Coding des Demo-Programms zusammenstöpseln müssen. Frustrationspotential definitiv vorhanden. 😀

Update:

LibNoDave von den Quellen kompillieren bedeutet den „üblichen make-dreisatz“.

git clone git://github.com/netdata/libnodave.git
cd libnodave
make
sudo make install

Bei Python-LibNoDave sieht es ähnlich etwas anders aus.

git clone git://github.com/netdata/python-libnodave
python setup.py install

Weiterleitung auf SSL-Proxy (all-inkl.de)

Um unter Apache eine Weiterleitung auf einen SSL-Proxy (all-inkl.de) zu erreichen, sind folgende Zeilen in der .htaccess nötig.

RewriteEngine on
#Falls kein HTTPS aufgrufen wurde...
RewriteCond %{HTTPS} off
#...und die Anfrage nicht von der Domain des Proxy kommt
RewriteCond %{HTTP:X-FORWARDED-SERVER} !^ssl-account\.com$ [NC]
#leite weiter auf den Proxy
RewriteRule ^(.*)$ https://ssl-account.com/meineDomain.de/$1 [R=301,L]

Vielen Dank an dieser Stelle an Daniel – http://zeit-zu-handeln.net/2012/01/allgemein/automatischer-redirect-zu-ssl-proxy-bei-all-inkl/

Auslieferung / Transport über BAPI anlegen

Um im ERP eine Auslieferung in Bezug zu einem Kundenauftrag anzulegen, ist folgender BAPI nötig.

DATA lt_sales_order_items TYPE TABLE OF bapidlvreftosalesorder.
DATA ls_sales_order_item LIKE LINE OF lt_sales_order_items.

ls_sales_order_item-ref_doc = lf_vbeln_ka.
APPEND ls_sales_order_item TO lt_sales_order_items.

CALL FUNCTION 'BAPI_OUTBOUND_DELIVERY_CREATE_SLS'
  IMPORTING
    delivery          = lf_vbeln_lf
  TABLES
    sales_order_items = lt_sales_order_items[]
    return            = lt_return[].

Einen Transport zur Auslieferung erstellt man über folgenden BAPI.

DATA lt_itemdata TYPE TABLE OF bapishipmentitem.
DATA ls_itemdata LIKE LINE OF lt_itemdata.
DATA ls_headerdata TYPE bapishipmentheader.

ls_headerdata-shipment_type    = lf_shtyp. " Transporttyp
ls_headerdata-trans_plan_pt    = lf_tplst. " Transportdispostelle
ls_headerdata-service_agent_id = lf_tdlnr. " Spediteur
ls_headerdata-status_plan      = 'X'.      " Status des TA setzen
ls_headerdata-status_checkin   = 'X'.

ls_itemdata-delivery  = lf_vbeln_lf.
ls_itemdata-itenerary = 1.
APPEND ls_itemdata TO lt_itemdata.

CALL FUNCTION 'BAPI_SHIPMENT_CREATE'
  EXPORTING
    headerdata = ls_headerdata
  TABLES
    itemdata   = lt_itemdata[]
    return     = lt_return[].

 

Inline Deklarationen von Variablen unter ABAP

Nach meinem Besuch des DSAG Treffens AK NetWeaver Development in Walldorf am 29.11. habe ich wieder ein paar nette Features mitnehmen dürfen. Eines der besten davon sind „inline Deklarationen“ im ABAP Code. Wer sich im Moment nichts darunter vorstellen kann, dem hilft vielleicht folgendes Beispiel.

Wer kennt es nicht? Innerhalb von TRY-CATCH-ENDTRY Konstrukten will man die geworfene Exception fangen und z.B. den Text auswerten. Die bisherige Schreibweise  (< ABAP 7.4) dafür ist wie folgt.

DATA:
  lo_exception TYPE REF TO cx_root.

TRY.
    me->raise_exception( ).

  CATCH cx_root INTO lo_exception.
    me->process_exception( lo_exception ).
    RETURN.

ENDTRY.

Ab ABAP 7.4 (Beta-Version kommt noch im Dezember! Ramp-Up dann Q1/2013) kann das Exception-Handling dann wie folgt aussehen.

TRY.
    me->raise_exception( ).

  CATCH cx_root INTO DATA(lo_exception).
    me->process_exception( lo_exception ).
    RETURN.

ENDTRY.

Ist doch deutlich knackiger als obiger Code, oder? 🙂

Ähnlich funktioniert auch die Definition von Variablen an einer beliebigen Stelle im Coding.

DATA(lf_test) = 'Wert'.

Vorsicht ist allerdings beim Gültigkeitsbereich der Variablen geboten. Eine z.B. innerhalb einer Schleife deklarierten Variable hat auch ausserhalb der Schleife Gültigkeit! Dieser Tatsache ist sich die SAP bewusst, will aber (anscheinend) an der Situation nichts ändern. Vielleicht ja dann in ABAP 7.5? 😉

ABAP Dokumentation in Popup darstellen

Um einen Doku-Text in einem Popup darzustellen, sind folgende Zeilen ABAP nötig.

  DATA:
   lt_ltext             TYPE          tlinetab,
   lt_exclude           TYPE TABLE OF hlpfcode,
   ls_help_info         TYPE          help_info.

  CALL FUNCTION 'HELP_DOCULINES_SHOW'
    EXPORTING
      help_infos = ls_help_info
    TABLES
      excludefun = lt_exclude[]
      helplines  = lt_ltext[].

WCF Hosting ohne Admin Rechte

WCF bietet von Haus aus die Möglichkeit, einen Service in einem Prozess anstatt im IIS zu hosten. Dadurch ist das Hosting wesentlich flexibler, denn zum einen erfordert ein HTTP Hosting nicht zwingend die Installation des IIS, zum anderen stehen auch andere Protokolle wie TCP/IP und Named Pipes zur Vefügung.

Der einzige Haken daran ist, dass ein Prozess, der ohne Admin Rechte läuft, nicht die Rechte hat um einen Service via HTTP zu hosten. Versucht man z.B. einen Windows Service ohne diese Rechte zu starten, erhält man die Fehlermeldung:

Service cannot be started. System.ServiceModel.AddressAccessDeniedException: HTTP could not register URL http://+:7270/[ServiceName]/. Your process does not have access rights to this namespace.

Es gibt aber einen Weg, den WCF Service auch ohne Admin Rechte zu hosten. Unter Windows Vista / 7 / Server 2008 (R2) steht dafür das Tool netsh zur Verfügung. Dadurch ist es möglich, einem Benutzer oder einer Gruppe Rechte auf einen HTTP Namespace, also z.b. „http://+:7270/ServiceName“ zu geben.

Die Syntax dafür lautet

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user

Für Windows XP oder Windows Server 2003 übernimmt das Tool httpcfg diese Aufgabe.

Weitere Informationen liefert der Artikel Configuring Namespace Reservations (http://msdn.microsoft.com/en-us/library/ms733768.aspx)

Updating ESXi 5.0 via Command Line Tools

With vSphere 5, vihostupdate and esxupdate are not applicable for ESXi 5. We instead need to use the esxcli command to apply the updates to our ESXi 5 hosts.

  • Make sure you have ESXi Shell access on the ESXi 5 host
  • Download the patch bundle directly from the VMware Support Website (http://www.vmware.com/patchmgr/download.portal). This download will be a .zip file. Do not extract it!
  • Upload the .zip file to a datastore that is accessible on the ESXi host you wish to update. The syntax below will use /vmfs/volumes/pool01, and you may need to adjust this as necessary. Note that the .zip file is uploaded to the ESXi host via the vSphere Client.
  • Set the host to maintenance mode via the vSphere Client
  • To verify which VIBs are already installed on the ESXi 5 host, issue the following command.
    esxcli software vib list | more
  • To find out which VIBs are available in the depot (the downloaded .zip file), issue the following command.
    esxcli software sources vib list --depot=/vmfs/volumes/pool01/updates/ESXi500-201109001.zip | more
  • To update the ESXi 5 host with the VIBs included in the depot, issue the following command.
    esxcli software vib update --depot=/vmfs/volumes/pool01/updates/ESXi500-201109001.zip
  • When the update is complete, verify the information presented. If prompted, reboot the ESXi 5 host (via vSphere Client)
  • If applicable, take the ESXi 5 host out of maintenance mode using the vSphere Client

Tinnitus

So… irgendwann hat es ja so kommen müssen. Seit nun ca. drei Wochen gehöre ich offiziell in den Club der „Tinnitus geplagten“. Mehr oder weniger gut kann ich dies natürlich aktuell verkraften; andererseits sehe ich langsam ein dass ein zwölf Stunden Arbeitstag doch nicht so das Wahre ist… :-/

Alles in allem bin ich aktuell wieder einigermaßen fit (zum arbeiten – klaro 😉 ). Ich werde euch immer mal wieder auf dem laufenden halten…