FLProg - Unabhängige Integration in das Programm von benutzerdefinierten Controllern


Das FLProg-Projekt wurde in Habré lange Zeit nicht behandelt. Dies liegt an dem Zeitmangel beim Schreiben von Artikeln und sogar an meinen persönlichen Problemen. Aber das Projekt ist nicht tot, es lebt und entwickelt sich. Durchschnittlich einmal im Monat wird die nächste Version des Programms veröffentlicht. Seit der letzten Veröffentlichung wurde das Rendern der Schaltung vollständig überarbeitet (dank dessen wurden Friese beim Rendern beseitigt), das Querverweis-System für das Projekt und ein System zur Analyse des Projekts auf Fehler wurden angezeigt. Der Programmcode selbst wurde auf eine neuere Version der Programmiersprache portiert. Aus diesem Grund hat sich die Programmoberfläche positiv verändert (aus meiner Sicht unterstützen mich natürlich die Benutzer). Viele interessante Blöcke wurden hinzugefügt. Schemaskalierung und Blocksuche implementiert.

Das Hauptproblem des Projekts bleibt jedoch, dass der Entwickler des Programms eine Person ist (das bin ich) und die Anzahl der verschiedenen Controller-Boards, Sensoren, Sensoren und Erweiterungskarten, die sowohl von Chinesen als auch in letzter Zeit von unseren Herstellern hergestellt werden, stetig wächst. Und Benutzer möchten sie ausprobieren oder in ihren Projekten verwenden. Bei Peripheriegeräten wurde dieses Problem zu einer Zeit von mir mithilfe eines benutzerdefinierten Blockeditors mehr oder weniger gelöst. Dieser Schritt, wie sie sagen, "Schuss", und jetzt, fast auf den meisten vorhandenen Peripheriekarten, im Internet oder im Programmforum , finden Sie den entsprechenden Benutzerblock. Nun, oder im selben Forum (oder in einer Gruppe in Vkontakte ) bitten Sie die lokalen Gurus, eine zu schreiben. Normalerweise kann man auf die eine oder andere Weise zustimmen.

Jetzt ist es Zeit, das zweite Problem zu lösen - das sind Controller-Boards.

Kürzlich wurde eine Beta-Version des Programms mit der Nummer 6.0 veröffentlicht. In dieser Version ist der Editor für Benutzerbeschreibungen von Steuerungen implementiert. Wie bei benutzerdefinierten Blöcken können Beschreibungen in Bibliotheken gruppiert, als separate Beschreibungen sowie ganze Bibliotheken als Datei gespeichert und gemeinsam genutzt werden.

Mit diesem Beitrag beginne ich eine Reihe von mindestens zwei Beiträgen, in denen wir uns überlegen, wie dieser Editor verwendet wird. Im ersten Artikel werde ich mit Erlaubnis von Shiotiny versuchen, sein ShIoTiny-Board zu beschreiben . Im zweiten Artikel werden wir versuchen, virtuell ein Analogon eines echten industriellen Controllers zu finden und es zu beschreiben.

Also fangen wir an.

Öffnen Sie das FLProg-Programm. Wählen Sie im Menü "Extras" den "Editor für benutzerdefinierte Controller-Beschreibungen".



Das Beschreibungseditorfenster wird geöffnet.

Benutzerdefinierte Beschreibungen können in der Bibliothek mit jeder Verschachtelungstiefe kombiniert werden. Daher erstellen wir zunächst eine Beschreibungsbibliothek.



Legen Sie den Namen der Bibliothek fest.



Danach erstellen wir eine Beschreibung des Controllers in der Bibliothek.



Und gib ihm einen Namen:



Beim Erstellen einer Controller-Beschreibung gelangen wir sofort zum Zweig der allgemeinen Parameter.



Hier können wir den Namen ändern, den CPU-Typ einstellen, die Größe des EEPROM einstellen, die Versionsnummer der Beschreibung ändern.

Da das ShloTiny-Board auf dem ESP8266-Controller basiert, wählen wir ihn aus. Bei der Auswahl eines Controllers wird automatisch das entsprechende EEPROM-Volume angebracht. Bei Bedarf kann dieser Wert geändert werden. Die Standardversionsnummer für die neue Beschreibung ist 1.

Wenn Sie in Zukunft vorhandene Beschreibungen ändern, wird empfohlen, diese in Richtung der Erhöhung zu ändern. Wenn Sie diese Beschreibung in einem Projekt verwenden, vergleicht das Programm die Version der Beschreibung im Projekt und in der Bibliothek. Wenn die Versionsnummer der Beschreibung in der Bibliothek größer als im Projekt ist, wird das Element zum Aktualisieren der Beschreibung im Programm im Menü "Projekt" des Programms angezeigt. Wenn umgekehrt, wird ein Element angezeigt, um die Beschreibung in der Bibliothek zu aktualisieren. Wenn die Beschreibung des im Projekt verwendeten Controllers überhaupt nicht in der Bibliothek gefunden wird, wird das Element zum Eingeben der Beschreibung aus dem Projekt in die Bibliothek im selben Menü angezeigt.

In diesem Thread können Sie auch eine Textbeschreibung des Controllers schreiben, die bei der Auswahl hilft.

Klicken Sie auf die Schaltfläche "Übernehmen", um die vorgenommenen Änderungen zu übernehmen, bevor Sie zu einem anderen Zweig der Controller-Parameter wechseln. Andernfalls werden die Änderungen nicht gespeichert.

Betrachten Sie nun den Schaltplan der ShloTiny-Karte.



Die Karte verfügt über drei digitale Eingänge, drei digitale Ausgänge, einen analogen Eingang und einen Eingang für den Sensor. Insgesamt acht Schlussfolgerungen des Vorstandes.

Gehen Sie im Editor zum Zweig "Controller-Schlussfolgerungen" und legen Sie die Anzahl der Schlussfolgerungen fest. Vergessen Sie nicht, danach auf die Schaltfläche "Übernehmen" zu klicken.



Das Programm wird die erforderliche Anzahl von Schlussfolgerungen generieren. Wir gehen zum ersten von ihnen über.



In diesem Zweig können Sie einen alternativen Ausgabenamen angeben, der im Programm angezeigt wird. Wenn es nicht vorhanden ist, zeigt das Programm PinN an, wobei N die Pin-Nummer in der Pin-Liste ist. Ich empfehle, dass Sie eine Inschrift an die Tafel im Feld für den alternativen Namen schreiben. Dies erleichtert das Verständnis der Schlussfolgerungen. Für die beschriebene Karte geben wir dort den Wert von Input1 gemäß Schaltplan ein. In diesem Thread können Sie also eine individuelle Beschreibung der Ausgabe schreiben, um beispielsweise die Funktionen ihrer Anwendung anzugeben. Bei Bedarf können Sie auch einen Alias ​​für die Ausgabe angeben, der im Programm in Klammern nach dem Namen der Ausgabe angezeigt wird.

Vergessen Sie nach dem Vornehmen der Änderungen nicht, auf die Schaltfläche "Übernehmen" zu klicken. Nennen wir nach dem gleichen Prinzip die verbleibenden Schlussfolgerungen.



Im selben Zweig der Hauptausgabeparameter werden die von ihm ausgeführten Funktionen hinzugefügt.



Die folgenden Funktionen können jedem Pin zugewiesen werden.



  • I2C ist eine Funktion eines der I2C-Bus-Pins (SDA oder SCL).
  • SPI ist eine Funktion eines der SPI-Bus-Pins (MISO, MOSI, SCK, SS).
  • UART ist eine Funktion eines der Pins der UART-Schnittstelle (RX oder TX).
  • Analogeingangsfunktion
  • Analoge Ausgangsfunktion (noch nicht in FLProg verwendet, Rückstand für die Zukunft).
  • Digitale Ein- / Ausgabefunktion.

Weisen Sie die digitale Eingangs- / Ausgangsfunktion von Pin 1 zu. Wenn Sie dem Ausgang eine neue Funktion (noch nicht konfiguriert) zuweisen, wird der Zweig „Fehler“ im Controller-Baum angezeigt und der gesamte Pfad zum Zweig der falschen Funktion wird rot. Im Zweig "Fehler" sehen Sie eine Liste der Fehler in der Controller-Beschreibung.



In diesem Fall gibt Eingang 1 in der Funktion „Digitaler Ein- / Ausgang“ die Nummer dieses Eingangs nicht als digital an. Wir wechseln zum Zweig dieser Funktion (in Zukunft plane ich einen direkten Übergang zum gewünschten Zweig, wenn ich auf einen Fehler klicke).



Entsprechend dem Schaltplan der Karte ist der Ausgang „Input1“ mit dem GPIO2-Pin der Steuerung verbunden. Diesen Wert geben wir in das Feld „Digitale Eingangsnummer“ ein. Beim Kompilieren eines Projekts wird dieser Wert in den Code eingefügt. Da die Verwendung dieser Eingabe als Ausgabe nicht vorgesehen ist, entfernen wir das Kontrollkästchen "Kann als Ausgabe verwendet werden". Klicken Sie wie immer auf die Schaltfläche "Übernehmen". Konfigurieren Sie auf die gleiche Weise die beiden anderen digitalen Eingänge. Gehen Sie dann zum Ausgang des Analogeingangs "ADC1" und fügen Sie die Funktion "Analogeingang" hinzu.



In den Einstellungen dieser Funktion müssen Sie die Nummer dieses Ausgangs als Analogeingang angeben. Gemäß dem Schema ist dies 0 (in ESP8266 ist es eins).



Gehen Sie dann zur Ausgabeeinstellung "1WIRE". Hier fügen wir die digitale Ein- / Ausgabefunktion hinzu, verbieten jedoch die Verwendung von Eingabe und Ausgabe. Infolgedessen steht es nur in den Sensorblöcken zur Auswahl und ist beim Erstellen von Ein- und Ausgängen nicht verfügbar.



Die Einstellungen der Ausgänge „K1“ - „K3“ ähneln den Einstellungen der Eingänge „Input1“ - „Input3“ nur bei Ausgängen, deren Verwendung als Eingang verboten ist.





Gehen Sie zum Zweig "Bilder". Darin können wir Bilder hinzufügen, die in die Beschreibung des Controllers geladen wurden, z. B. mit dem Erscheinungsbild des Controllers, der Pinbelegung usw.

Bitte beachten Sie, dass Bilder direkt in die Controller-Beschreibung geladen und in einem damit erstellten Projekt gespeichert werden. Laden Sie daher keine großen Bilder hoch. Dies führt zu einer Vergrößerung des Projekts und wirkt sich auf die Geschwindigkeit seiner Eröffnung aus.

Das Bild wird über die Schaltfläche "Bild hinzufügen" hinzugefügt.



Nach Auswahl und Laden eines Bildes (nur das PNG-Format wird unterstützt) wird für jedes Bild im Baum ein separater Zweig erstellt. In diesem Zweig können Sie einen Namen für das heruntergeladene Image angeben, der in den Controller-Informationen angezeigt wird.



Bei Bedarf können Sie mehrere Bilder hochladen und in der gewünschten Reihenfolge einstellen.





Wir gehen zum Zweig "Standardblöcke" über.



Dieser Zweig zeigt die Blöcke, die in der Bibliothek der Standardblöcke des Programms gemäß den aktuellen Einstellungen des Programms dargestellt werden können. Was bedeutet das. Einige der Bausteine ​​des Programms sind nur für bestimmte CPU-Typen vorgesehen. Und ihre Verfügbarkeit hängt vom ausgewählten Prozessor ab. Außerdem werden Blöcke, die für die Arbeit mit SPI, I2C und UART ausgelegt sind, nur dann in dieser Liste angezeigt, wenn den Controller-Pins die entsprechenden Funktionen hinzugefügt wurden. Blöcke, die für die Arbeit mit dem EEPROM ausgelegt sind, werden nur angezeigt, wenn die im Zweig der allgemeinen Controller-Parameter angegebene EEPROM-Größe größer als Null ist oder die I2C-Funktion zu den Controller-Pins hinzugefügt wird. Standardmäßig dürfen nicht alle Blöcke in der Bibliothek verwendet werden (orange markiert). Sie können die Verwendung eines separaten Blocks oder des gesamten Blockordners zulassen, indem Sie den erforderlichen Zweig markieren und auf die Schaltfläche "Zulassen" oder im Kontextmenü klicken.



Wenn Sie zulassen, dass ein Block oder ein Ordner mit Blöcken im Programm angezeigt wird, werden diese schwarz gestrichen.

Das Blockieren eines Blocks oder eines separaten Ordners ist in gleicher Weise untersagt.



In einem Ordner, in dem nicht alle Blöcke angezeigt werden dürfen, sind sie vor und nach dem Namen mit drei Sternchen gekennzeichnet.

Wir verbieten die Verwendung von Motoren, Echtzeituhren, Displays, IR-Steuergeräten, Sensoren (außer DS18B20- und DHT22-Sensoren - wie der Board-Entwickler bisher nur ihre Unterstützung angekündigt hat), Erweiterungs-Chips und einem Piezo-Lautsprecher.



Wir werden dasselbe für die KOP-Sprache tun



Vergessen Sie nicht, sie nach Änderungen anzuwenden.

Die verbleibenden Zweige der Controller-Beschreibung werden im nächsten Beitrag erläutert, während die aktuellen Einstellungen ausreichen, um diese bestimmte Karte im FLProg-Programm zu verwenden.

Im Moment möchte ich nur kurz sagen, dass der Zweig "Spezielle Blöcke" verwendet wird, um benutzerdefinierte Blöcke in die Beschreibung zu laden, die bei Verwendung dieses Controllers in der Bibliothek der Standardblöcke im Programm angezeigt wird. Der Zweig "Spezialcode" wird verwendet, um den Code aufzuzeichnen, der immer in den kompilierten Code eingefügt wird, und der Zweig "Spezialbibliotheken" wird verwendet, um Bibliotheken in die Beschreibung des Controllers zu laden, die in den Ordner \ library ArduinoIDE hochgeladen werden, mit dem das Programm arbeitet.

Speichern Sie nach allen Änderungen die Controller-Beschreibungsbibliothek.



Versuchen wir nun, die von uns erstellte Controller-Beschreibung zu verwenden.
Im FLProg-Programm erstellen wir ein neues Projekt für den Controller.



Öffnen Sie das Controller-Auswahlfenster.



Und wählen Sie die Beschreibung aus, die wir erstellt haben.



Bei der Auswahl eines Controllers können Sie dessen Bilder anzeigen und bei Bedarf die erforderlichen Bilder in einer Datei speichern.





Sie können auch andere Parameter sehen



Bestätigen Sie nach Auswahl des Controllers dessen Auswahl:



Infolgedessen wird das Hauptarbeitsfenster des Projekts geöffnet, das gemäß der ausgewählten Steuerung konfiguriert wurde.



Der Zweck dieses Beitrags beinhaltet nicht die Aufgabe der Schulung für die Arbeit mit dem FLProg-Programm. Dies ist in meinen vorherigen Beiträgen , auf der Projektwebsite und im Projektforum ziemlich gut beschrieben. Darüber hinaus gibt es auf YouTube bereits zahlreiche Kanäle, in denen Video-Tutorials zur Arbeit mit dem Programm veröffentlicht werden. Zum Beispiel führt ein sehr guter Kanal „Key to Arduino“ gerade eine Reihe von Lektionen mit einer sehr guten Präsentation des Materials durch.

Deshalb erstellen wir zum Beispiel einfach ein einfaches Projekt und versuchen es zu kompilieren.
Fügen Sie zuerst den Controller-Eingang hinzu.



Nur die Schlussfolgerungen, dass wir in dieser Funktion arbeiten durften, stehen als Input zur Auswahl.



Erstellen Sie dann einen digitalen Ausgang. Hier sind auch nur zulässige Schlussfolgerungen verfügbar.



Wir bauen die Schaltung so zusammen, dass beim Drücken der Taste an Eingang 1 (Eingang 1) das Relais K1 (Relais 1) eingeschaltet wird.
Wir ziehen das Gerät auch zum Lesen von Informationen vom DS18B20-Sensor auf eine Leiterplatte in einer separaten Platine.



Gehen Sie zu den Blockeinstellungen. Beim Erstellen des neuen OneWire-Busses sehen wir, dass alle digitalen Ein- / Ausgänge zur Auswahl stehen. Dies ist ein Fehler in Version 6.0. Da diese Version jedoch noch den Beta-Status hat, ist sie entschuldbar. In Version 6.1 kann die Verwendung eines Stifts als Sensor, Sensor oder für Erweiterungs-Chips verboten werden. Darüber hinaus werde ich Ihnen im nächsten Beitrag einen anderen Weg zur Lösung dieses Problems erläutern. Wählen Sie zunächst den 1WIRE-Pin.



Wir konfigurieren den Sensor so, dass die Adresse über das Array eingestellt wird.



Wir legen eine neue Karte vor die erste und ziehen den Block „OneWire Bus Scan“ heraus.



Wir konfigurieren es auf demselben OneWire-Bus und auf demselben Array, auf dem die Leseeinheit vom DS18B20-Sensor konfiguriert ist.



Wir stellen ein Schema für einen einzelnen Start eines Bus-Scans zusammen, wenn der Controller startet, indem wir den R-Block des Triggers verwenden (Auswahl der Vorderflanke).



Auf einer Platine mit einer Datenleseeinheit vom DS18B20-Sensor bauen wir einen Relais-Ein / Aus-Schaltkreis mit Hysterese zusammen. Dazu verwenden wir zwei Komparatoren und einen SR-Trigger. Dank dieses Schemas schaltet sich Relais 2 ein, wenn die Temperatur unter 10 Grad fällt, und aus, wenn die Temperatur über 20 Grad steigt.



Wir starten das Kompilierungsschema.



Infolgedessen wird der resultierende Code in der Arduino IDE geöffnet. Als Board wählen wir NodeMCU, auf dem derselbe Chip wie auf ShloTiny installiert ist. Das Überprüfen des Codes zeigt, dass er korrekt ist und heruntergeladen werden kann.



Kompilierter Code
#include <OneWire.h> extern "C" { #include "user_interface.h"; } OneWire _ow13(13); byte _FLPArray133289689[9]; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; bool _trgr1 = 0; bool _bounseInputD2S = 0; bool _bounseInputD2O = 0; unsigned long _bounseInputD2P = 0UL; bool _trgrt1 = 0; bool _trgrt1I = 0; bool _sowb1_needScan = 0; bool _sowb1_ost = 0; bool _sowb1_Out_1 = 0; void setup() { pinMode(2, INPUT); pinMode(12, OUTPUT); pinMode(14, OUTPUT); _bounseInputD2O = digitalRead(2); } void loop() { bool _bounceInputTmpD2 = (digitalRead (2)); if (_bounseInputD2S) { if (millis() >= (_bounseInputD2P + 40)) { _bounseInputD2O = _bounceInputTmpD2; _bounseInputD2S = 0; } } else { if (_bounceInputTmpD2 != _bounseInputD2O ) { _bounseInputD2S = 1; _bounseInputD2P = millis(); } } //:1 if (1) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; if (_sowb1_needScan) { if ( _oneWireSeach (_FLPArray133289689, _ow13)) { _sowb1_Out_1 = 1; } _ow13.reset_search(); _sowb1_needScan = 0; } if (_trgrt1) { if (! _sowb1_ost) { _sowb1_ost = 1; _sowb1_needScan = 1; _sowb1_Out_1 = 0; } } else { _sowb1_ost = 0; } //:2 digitalWrite(12, !(_bounseInputD2O)); //:3 if (_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O = _readDS18_ow13(_FLPArray133289689, _FLPArray133289689[8]); } if (((_d18x2x1O)) > (20)) _trgr1 = 0; if (((_d18x2x1O)) < (10)) _trgr1 = 1; digitalWrite(14, _trgr1); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow13(byte addr[8], byte type_s) { byte data[12]; byte i; _ow13.reset(); _ow13.select(addr); _ow13.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow13.read(); } _ow13.reset(); _ow13.select(addr); _ow13.write(0x44, 1); return _convertDS18x2xData(type_s, data); } bool _oneWireSeach (byte array[], OneWire ow ) { byte temp[8]; byte i; if ( !ow.search(temp)) { return false; } if (OneWire::crc8(temp, 7) != temp[7]) { return false; } switch (temp[0]) { case 0x10: array[8] = 1; break; case 0x28: array[8] = 0; break; case 0x22: array[8] = 0; break; default: return false; } for ( i = 0; i < 8; i++) { array[i] = temp[i]; } return true; } 


Beschreibung des ShloTiny-Controllers für das FLProg-Programm

Wir werden diese Lektion beenden. Im nächsten Beitrag werden wir versuchen, etwas Ernsthafteres zu beschreiben, das „echten“ industriellen Steuerungen näher kommt.

Source: https://habr.com/ru/post/de467007/


All Articles