Die Bachmann M1 ist eine leistungsfähige Industriesteuerung.
Die CN für für die Bachmann M1 ist der Lua Standalone Version (https://www.lua.org/pil/1.4.html) sehr ähnlich, sie ist nur um die NOGS Bibliotheken erweitert.
Hier kann man den Start der CN im SolutionCenter sehen.
Installation
Alle benötigten Files sind auf Github zu finden: BachmannM1
Konfiguration der CN
Damit das CN Modul geladen werden kann muss eine entprechende Konfiguration in der mconfig.ini angelegt werden.
Die beiden Sektionen (BaseParams) und (ControlTask) sind in der Bachmann Dokumenetaion beschrieben.
Die Sektion (LuaTask) konfiguriert den eigendlichen Lua Task:
CycleTime in ms gibt die Rate an mit der der Lua Task läuft. Da Lua wie die meisten Programmiersprachen nicht auf Zyklen basiert, hat der Wert hier eine etwas andere Bedeutung als z.B. für einen IEC61131 Task. Bei einem CycleRatio von 50 (%) verbraucht der Lua Task maximal 50% der CPU Zeit. Das heißt, dass bei einer CycleTime von 10ms der Lua Task maximal 5ms läuft und dann für minimal 5m die CPU abgibt. Wenn der Lua Task fortgesetzt wird, wird die Systemroutine sys_CycleStart() aufgefrufen, beim abgeben sys_CycleEnd(). Finden in dem Lua Task asychrone Opertionen statt (z.B. Socket IO, warten auf System Resourcen) kann die verbrauchte Zeit deutlich unter 50% liegen.
CycleRatio gibt das Verhältnis von maximaler Laufzeit zur minimale Pausenzeit in % für den Task an. Es ist ein Bereich von 5% bis 95% möglich. Werte über 50% sollte man meiden.
Startup gibt das Verzeichnis und Lua File an welches von der CN gestarted werden soll.
AutoRestart gibt an ob die Lua Applikation nach einem Fehler automatisch neu gestarted wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[CN] (BaseParms) Partition = 2 DebugMode = 0x0 Priority = 130 ModuleIndex = 0 ModulePath = /cfc0/app/ ModuleName = cn.m (ControlTask) CycleTime = 10.000000 Priority = 90 WatchdogRatio = 0 TimeBase = Tick (LuaTask) CycleTime = 10.000000 CycleRatio = 50 Priority = 100 WatchdogRatio = 5 Startup = /app/startup.lua AutoRestart = OFF |
Die Demos benötigen diese Modulkonfiguration:
An das GIO212 wird an Kanal eins ein PT100 angeschlossen. Der Rest bleib unbelegt. Die Versorgungsspannung wird an 17, 19 (+24) und and 28, 20 (0V) angeschlossen.
Download
- Erste Version
- Fehlerbehebung und Optimierung
- Option LuaTask AutoRestart bewirkt einen Neustart wenn das Lua Programm beendet wird
- Unterstützung für den Codegenerator von p+
- Umgezogen auf Github
- Fehlerbehebung
- (CycleRatio) eingebaut
- Neue Funktion svi.createVariable(name, type) zum erstellen von SVI Variablen unter dem CN Task
- Vollständige Einbindung in p+
Beispiele für Lua Scripte
Enthalte Module auflisten
Wie unter Bibliotheken beschrieben gibt es Bibliotheken die bereits in der CN enthalten sind. Mit diesem kleinen Programm kann man sich anzeigen lassen welche das sind:
1 2 3 4 |
print('----- List of preloaded modules -----') for k, _ in pairs(package.preload) do print(k) end |
Die Ausgabe auf der Konsole der Bachmann M1 wird etwa so aussehen:
1 2 3 4 5 6 7 8 9 10 |
----- List of preloaded modules ----- tasking sys mime.core base64 bytes struct svi m1 socket.core |
socket.core und mime.core gehören zu der Socket Bibliothek welch als Lua File vorliegt. Sie können nicht direkt verwendet werden.
Abfragen der Module
Eine Bachmann M1 kann bis zu 16 Stationen besitzen auf der bis zu 16 Module gesteckt werden können. Dabei darf es die CPU nur einmal geben. Um die Module und ihre Position aufzulisten kann man über den Bus der Steuerung ilterrieren:
1 2 3 4 5 6 7 8 9 |
print('----- Test m1 -----') do local m1 = require 'm1' local bus = m1.getBus() print('Devices on the local bus:') for i, t in pairs(bus) do print(i, bus[i].name) end end |
Auf der Konsole erscheint bei der oben geigten Konfiguration:
1 2 |
104 GIO212 101 NT255 |
Bitte beachten das Listen in Lua die aus key/value Paaren bestehen in beliebiger Reihenfolge erscheinen!
Der Zahlenwert 101 bedeutet: Station 1, Modul 1. Dort befindet sich das Netzteil NT255
Der Zahlenwert 104 bedeutet: Station 1, Modul 5. Dort befindet sich das IO Modul GIO212
Neben dem Name (bus[].name) gibt es weiter informationen wie: card, slot, mode, state, category, macChannels, driveName, current5V, currentP15V, currentM15V u.s.w.
Wichtig sind die Funktionen getValue, setValue und getError.
Lauflicht
Es soll ein Lauflicht mit 8 Kanälen auf dem GIO212 realisiert werden. Die Kanähle 5 bis 8 müssen zu dem Zweck als Ausgänge eingestellt werden (siehe Bachmann Dokumentation)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
local cn = require 'cn.cn' local timers = require 'cn.timers' local m1 = require 'm1' local bus = m1.getBus() assert(bus[104], 'No module on station 1, slot 4!') assert(bus[104]:getValue(1) ~= 'GIO212', 'Not a GIO212!') -- -- MIO sample: LED animation -- timers.add( 0.05, coroutine.create( function() while true do bus[104]:setValue(5, true) coroutine.yield() bus[104]:setValue(6, true) coroutine.yield() bus[104]:setValue(7, true) coroutine.yield() bus[104]:setValue(8, true) coroutine.yield() bus[104]:setValue(5, false) coroutine.yield() bus[104]:setValue(6, false) coroutine.yield() bus[104]:setValue(7, false) coroutine.yield() bus[104]:setValue(8, false) coroutine.yield() end end ) ) while cn.idle() do end |
PT100 abfragen
Auf der Station 1, Modul 4 befindet sich ein GIO212 bei dem der erste Kanal als PT100 Temperatursensor konfiguriert ist. Es wird ein Timer angelegt der die Temperatur alle 5 Sekunden ausließt und auf der Konsole anzeigt.
1 2 3 4 5 6 7 8 9 10 11 12 |
local cn = require 'cn.cn' local timers = require 'cn.timers' local svi = require 'svi' timers.add( 5, function() print(svi.readVariable('MIO/4/1') * 0.1 - 273.15) end ) while cn.idle() do end |
Diesmal findet der Zugriff auf das Modul über das SVI der Steuerung statt.
Beispiel für p+
Die CN für die Bachmann M1 ist vollständig in das p+ System integriert.
Dabei ist es möglich die Simulation auf dem lokalen Rechner laufen zu lassen und die Bachmann Module als Ein-/Ausgänge zu nutzten.
Es ist auch möglich die Simulation direkt (standalone) auf der Bachmann CPU auszuführen.
Hier ein einfaches Lauflicht mit einem DO216 Modul welches auf der Bachmann CPU läuft.
Um die Simulation auf die Bachmann zu laden, muss der entprechende Remote taget konfiguriert werden. Dafür ist die IP Adresse notwendig, User Name und Passwort sowie der Pfad wo die Files der Simulation abgelegt werden sollen. Bei einem upload wird der CN Task automatisch angehalten und mit den neuen Files wieder gestartet.
Bachmann M1 PLC ist ein Produkt der Firma Bachmann