Jump to content
View in the app

A better way to browse. Learn more.

Tinkerunity

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

FlyingDoc

Members
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von FlyingDoc

  1. Geschrieben

    Wie groß ist denn die längte Strecke?

     

    Wenn du PTC Bricklet nimmst benutze 4 Leiter Sensoren.

    Dann kannst du auch lange Strecken verlegen vom Bricklet zum Sensor.

    Durch die 4 Leitertechnik wird der Messfehler vernachlässigbar.

     

    Ansonsten nimmst du halt bei sehr weiten Strecken jeweils einen Master mit PTC Bricklet und eine RS485 vor Ort und verbindest die Stapel mit RS485 untereinander.

    Diese kannst du dann als einen Stapel behandeln.

  2. Geschrieben

    Hier mal meinen Code wie ich es benutze.

    Schreiben tue ich mit QT. Dann kann man das Programm sowohl auf Windows als auch auf Linux Rechnern laufen lassen.

     

    Ich hoffe es hilft dir etwas weiter.

    Mein Programm geht dynamisch mit den Komponenten um.

    Ich habe eine Dynamische Liste in der alle gespeichert werden.

    Ausserdem ordne ich diese dann der Reihenfolge im Stapel nach.

    Es ist auch egal wo sie angesteckt werden.

    Zum Beispiel:

    Der erste gefundene Quad Relais bekommt bei mir die ID 0 - 3.

    Egal an welchem Master er angesteckt wird.

    Wenn in der Reihenfolge kein anderer Quad davor kommt, bekommt er die Nummern 0-3. Der nächste dann 4-7 u.s.w.

    In meiner Liste ist jede Komponente mit Typ und UID hinterlegt.

    Darüber kann ich sie dann finden und ansprechen. Bei Callback zum Beispiel.

     

    void Create_REDBrick(const char* device_uid, uint8_t device_identifier, const char *connected_uid,char position, bool is_new)
    {
        qDebug() << "Create_REDBrick " << device_uid << " connected_uid " << connected_uid << " position " << position;
        /****************************************************************************/
        /*						Create_REDBrick Bricklet einbinden						*/
        /****************************************************************************/
        Brick* NewBrick = NULL;
        QString DEVICE_UID = QString(device_uid);
        QString CONNECTED_UID   = QString(connected_uid);
        UID = strdup(device_uid);
        if(UID)
        {
    //            _strset( UID, 0 );
    //            strncpy_s(UID,strlen(device_uid),  device_uid, strlen(device_uid)-1);
            /****************************************************************************/
            /*                             RED Brick erstellen      					*/
            /****************************************************************************/
            if(Mainprogramm)
            {
                if(!Mainprogramm->Check_Brick(DEVICE_UID))
                {
                    NewBrick = new Brick("Redbrick",0,0,DEVICE_UID,CONNECTED_UID,(QString)position);
                    NewBrick->Redbrick = new RED();
                    red_create(NewBrick->Redbrick, device_uid,ipcon);
                    Mainprogramm->Bricklist.append(NewBrick);
                }
                else
                {
                    NewBrick = Mainprogramm->Get_Brick(DEVICE_UID);
                }
                Mainprogramm->Set_enumeratebit();
            }
        }
    }
    
    void Create_Master(const char* device_uid, uint8_t device_identifier, const char *connected_uid,char position, bool is_new)
    {
        qDebug() << "Create_Master " << device_uid << " connected_uid " << connected_uid << " position " << position;
        /****************************************************************************/
        /*							Master Brick einbinden							*/
        /****************************************************************************/
        Brick*  NewBrick    = NULL;
        QString DEVICE_UID  = QString(device_uid);
        QString CONNECTED_UID   = QString(connected_uid);
        UID = strdup(device_uid);
        if(UID)
        {
            /****************************************************************************/
            /*							Master Brick erstellen							*/
            /****************************************************************************/
            if(Mainprogramm)
            {
                if(!Mainprogramm->Check_Brick(DEVICE_UID))
                {
                    NewBrick = new Brick("Master",0,0,DEVICE_UID,CONNECTED_UID,(QString)position);
                    NewBrick->master = new Master();
                    master_create(NewBrick->master, device_uid,ipcon);
                    Mainprogramm->Bricklist.append(NewBrick);
                }
                else
                {
                    NewBrick = Mainprogramm->Get_Brick(DEVICE_UID);
                }
                if(NewBrick)
                {
                    uint16_t voltage    = 0;
                    uint16_t current    = 0;
                    uint16_t usbvoltage = 0;
                    master_get_stack_voltage(NewBrick->master, &voltage);
                    master_get_stack_current(NewBrick->master, &current);
                    master_get_usb_voltage(  NewBrick->master, &usbvoltage);
                    Mainprogramm->Set_Stackvoltage(voltage/1000);
                    Mainprogramm->Set_Stack_current(current/1000);
                    /****************************************************************************/
                    /*						Master Brick Callback erstellen						*/
                    /****************************************************************************/
                    master_register_callback(NewBrick->master,MASTER_CALLBACK_STACK_VOLTAGE , (void*)cb_stack_voltage,NewBrick->master);
                    master_register_callback(NewBrick->master,MASTER_CALLBACK_USB_VOLTAGE 	, (void*)cb_stack_voltage,NewBrick->master);
                    master_register_callback(NewBrick->master,MASTER_CALLBACK_STACK_CURRENT	, (void*)cb_stack_current,NewBrick->master);
    
                }
                Mainprogramm->Set_enumeratebit();
            }
        }
    }
    
    void cb_enumerate(const char *uid, const char *connected_uid, char position, uint8_t hardware_version[3], uint8_t firmware_version[3], uint16_t device_identifier, uint8_t enumeration_type, void *user_data)
    {
        qDebug() << QTime::currentTime().toString("hh:mm:ss:zzz   ")  << "cb_enumerate( " << uid << " , " << connected_uid << " , " << position << " , " << hardware_version << " , " << firmware_version << " , " << device_identifier << " , " << enumeration_type << "*user_data)";
        /****************************************************************************/
        /*				Antwort auf	Komponentenabfrage (Bricks,Bricklets) 			*/
        /****************************************************************************/
        int n = 0;
        bool New = false;
        QString DEVICE_UID = QString(uid);
        if(Mainprogramm)
        {
            if(!Mainprogramm->Check_Brick(DEVICE_UID))
            {
                New = true;
            }
        }
        if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
        {
            Mainprogramm->Remove_Brick(DEVICE_UID);
        }
    
        if(device_identifier==MASTER_DEVICE_IDENTIFIER)
        {
            if(enumeration_type == IPCON_ENUMERATION_TYPE_AVAILABLE)
            {
                Create_Master(uid,device_identifier, connected_uid, position,true);
                uid_master = uid;
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "Master Brick gefunden";
                printf("Enumeration Type:  %d\n", enumeration_type);
            }
            if(enumeration_type == IPCON_ENUMERATION_TYPE_CONNECTED)
            {
                Create_Master(uid,device_identifier, connected_uid, position,true);
                uid_master = uid;
                printf("Enumeration Type:  %d\n", enumeration_type);
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "Master Brick verbunden";
            }
            if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
            {
                printf("Enumeration Type:  %d\n", enumeration_type);
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "Master Brick disconnected";
                Brick* OldBrick = Mainprogramm->Get_Brick(DEVICE_UID);
                if(OldBrick)
                {
                    Mainprogramm->Remove_Brick(DEVICE_UID);
                    master_destroy(OldBrick->master);
                    delete OldBrick->master;
                    OldBrick->master = NULL;
                    Mainprogramm->Remove_Brick(DEVICE_UID);
                }
            }
    
        if(device_identifier==INDUSTRIAL_QUAD_RELAY_DEVICE_IDENTIFIER)
        {
            if(enumeration_type == IPCON_ENUMERATION_TYPE_AVAILABLE)
            {
                Create_Industrial_Quad_Relay[n](uid,device_identifier, connected_uid, position,true);
                uid_Digital_In = uid;
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "DIGITAL QUAD OUT Brickled gefunden";
                printf("Enumeration Type:  %d\n", enumeration_type);
            }
            if(enumeration_type == IPCON_ENUMERATION_TYPE_CONNECTED)
            {
                Create_Industrial_Quad_Relay(uid,device_identifier, connected_uid, position,true);
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "DIGITAL QUAD OUT Brickled gefunden";
                printf("Enumeration Type:  %d\n", enumeration_type);
            }
            if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
            {
                printf("Enumeration Type:  %d\n", enumeration_type);
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "DIGITAL QUAD OUT Brickled disconnected";
                Brick* OldBrick = Mainprogramm->Get_Brick(DEVICE_UID);
                if(OldBrick)
                {
                    industrial_quad_relay_destroy(OldBrick->Quad_Relay);
                    delete OldBrick->Quad_Relay;
                    OldBrick->Quad_Relay = NULL;
                }
            }
        }
        }
    
        if(device_identifier==RED_DEVICE_IDENTIFIER)
        {
            if(enumeration_type == IPCON_ENUMERATION_TYPE_AVAILABLE)
            {
                Create_REDBrick(uid,device_identifier, connected_uid, position,true);
                uid_Redbrick = uid;
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "RED Brick gefunden";
                printf("Enumeration Type:  %d\n", enumeration_type);
            }
            if(enumeration_type == IPCON_ENUMERATION_TYPE_CONNECTED)
            {
                Create_REDBrick(uid,device_identifier, connected_uid, position,true);
                uid_Redbrick = uid;
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "RED Brick gefunden";
                uid_Redbrick = uid;
                printf("Enumeration Type:  %d\n", enumeration_type);
            }
            if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
            {
                printf("Enumeration Type:  %d\n", enumeration_type);
                qDebug() << "Enumeration Type: " << enumeration_type;
                qDebug() << "RED Brick disconnected";
                Brick* OldBrick = Mainprogramm->Get_Brick(DEVICE_UID);
                if(OldBrick)
                {
                    red_destroy(OldBrick->Redbrick);
                    delete OldBrick->Redbrick;
                    OldBrick->Redbrick = NULL;
                    Mainprogramm->Remove_Brick(DEVICE_UID);
                }
            }
        }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        qDebug() << "main(" << argc << " , " << argv << ")";
        QString Puffer;
        int Pos = 0;
        while(Pos < argc)
        {
            Puffer = argv[Pos];
            qDebug() << "Arg " << Pos << " : " << Puffer;
            if(Puffer.contains("IP="))
            {
                TFIP = Puffer.remove("IP=");
            }
            else if(Puffer.contains("PORT="))
            {
                Puffer = Puffer.remove("PORT=");
                PORT = Puffer.toInt();
            }
            Pos++;
        }
        /****************************************************************************/
        /*							Hauptprogramm starten							*/
        /****************************************************************************/
        if(Mainprogramm == NULL)
        {
            qDebug() << "Touchprogram erstellen";
            Mainprogramm = new Touchprogram();
            Mainprogramm->Read_Ini();
            Mainprogramm->Run();
            Mainprogramm->window->update();
            if(Mainprogramm->LOCALHOST)
            {
                TFIP = "localhost";
            }
            else
            {
                TFIP = Mainprogramm->TFIP;
            }
            PORT = Mainprogramm->PORT;
        }
    
        /****************************************************************************/
        /*							IPConnection erstellen							*/
        /****************************************************************************/
    
        HOST = (char *)malloc((TFIP.length() + 1) * sizeof(char));
        strcpy(HOST, TFIP.toStdString().c_str());
        qDebug() << "Create IPConnection";
        if(!ipcon)
        {
           ipcon = new IPConnection();
        }
        if(ipcon)
        {
            qDebug() << "Create IPConnection success";
            ipcon_create(ipcon);
            qDebug() << "connect to " << HOST << " Port: " << PORT;
            if(ipcon_connect(ipcon, HOST, PORT) < 0)
            {
                qDebug() << "Could not create connection";
                fprintf(stderr, "Could not create connection\n");
                ipcon_set_auto_reconnect(ipcon,true);
            }
        }
        else
        {
            qDebug() << "Could not create  IPConnection";
        }
        /****************************************************************************/
        /*					Komponenten (Bricks,Bricklets) abfragen					*/
        /****************************************************************************/
        ipcon_register_callback(ipcon,   IPCON_CALLBACK_ENUMERATE,(void *)cb_enumerate   ,NULL);
        ipcon_enumerate(ipcon);
    
        return a.exec();
    }
    
    
    

  3. Geschrieben

    Da ihr ja ab dem 10er Image den  CPU frequency scaling governor benutzt hätte ich einen Vorschlag.

    Wie wäre es wenn ihr im Brick Viewer die Möglichkeit anbietet, der  CPU frequency scaling governor einstellen zu können und der RED dann damit auch startet und läuft. Es also permanent hinterlegt.

    So könnte man diesen seinen Bedürfnissen anpassen.

    Einige würden gerne Strom sparen, andere wiederum immer mit Highperformance.

    Andere wiederum die Standardeinstellung nutzen.

     

  4. Geschrieben

    Also so we ich es sehe fürst du dein Solarmodul Zeitgesteuert. Also je nach Zeit eine bestimmte Position. Richtig?

    Warum fürst du dein Solarmodul nicht nach dem wirklichen Sonnenstand?

    Ich habe sowas vor knapp über 20 Jahren mit einer Microsteuerung von Conrad für einen Kumpel gebaut.

    Nur das ich seine Solarmodule, hatte er selber gebaut in dem er Wasser durch Rohre geführt hat um seinen Kessel zu erwärmen, über zwei kleine Solarmodule dem Sonnenstand nachgeführt habe.

    Ich hab nur eine Achse gesteuert. Lässt sich aber einfach auf 2 Achsen, also Höhe und Schwenken, erweitern.

    Dazu habe ich einfach 2 Minisolarzellen direkt nebeneinander gelegt und dann das ganze in ein Gehäuse eingebaut, das oben eine definierte Öffnung hatte.

    Dazu habe ich die Spannung beider Solarzellen verglichen und die Solarmodule , an dem meine Solarmesseinrichtung mit befestigt waren, einfach solange in die Richtung bewegt bis beide Solarzellen den fast gleichen Wert brachten.

    Die Richtung die man bewegen muss erkennt man daran, welche Solarzelle mehr Spannung liefert.

     

    Ansonsten eine gute einfache Umsetzung. ;)

  5. Geschrieben

    Hi. Mir ist ein kleines Problem mit der mechanischen Belastbarkeit der Ethernet Master Extension aufgefallen.

    Bei unserem neuem Projekt ist eine Ethernet Master Extension im Stapel verbaut.

    Nun ist es unserem Techniker beim Aufbau mehrmals kurz hintereinander "gelungen", das er die Buchse von der Leiterplatte , sagen wir mal "entfernt"  hat. ;D

    Ich habe mir den mechanischen Aufbau mal genauer angeschaut. Es braucht wirklich nicht viel Kraft, um die Buchse zu entfernen. Man braucht wirklich nur ungünstig an den Stecker zu kommen.

    Ich habe es mir angeschaut und habe einen einfachen, praktikablen Vorschlag, der auch nur Centbeträge in der Produktion kostet.

    Ihr müsst die Buchse nur zusätzlich aufkleben mit einem entsprechendem Kleber.

    Zum Beispiel Locktide oder ähnliche. Schon wäre das ganze Problem gelöst. :)

     

  6. Geschrieben

    Wenn ich auch mal darf.

    Arbeite gerade an einem Steuerungsprojekt.

    Wollte da das 10 IMG nehmen. Hab aber auch feststellen müssen das da irgend etwas nicht in Ordnung ist. Hab heute Früh mal zwischen einem blankem 10er und 9er Image verglichen. Siehe Bilder. Das 10 hat eine sehr hohe CPU Last. Selbst im Leerlauf.

    Die Screens habe ich bei genau der gleichen Hadware gemacht.

    Alle Bricks haben die aktuelle Firmware.

    Das 10er läuft beim Start bei 100% und pegelt sich bei ~70% ein. Es ist das blanke Image. Auf dem RED steck eine Ethernet Extension mit zugewiesener IP und ist online.

    9_Image_CPU_Last.thumb.jpg.e1c9621e859b33f77d81fd0342520d4b.jpg

    10_Image_CPU_Last.thumb.jpg.6f46dd59df50c334f4026ef6f2dfb6b5.jpg

    10_Image_CPU_Last2.thumb.jpg.08e7fbaaad23d70e0442d9f2abd63a24.jpg

  7. Geschrieben

    So. Heute  ähm Gestern ;D mal Zeit gehabt.

     

    tf@red-brick:/etc/init.d$ sudo eGTouch.sh start
    [sudo] password for tf:
    sudo: eGTouch.sh: command not found

     

    Hab mir dann mal die eGTouch.sh mit nano angeschaut.

    Folgendes steht drin.

    #!/bin/sh
    
    export DISPLAY=:0
    
    if [ -e /var/lib/lightdm/.Xauthority ]; then # ubuntu 15.04
            export XAUTHORITY=/var/lib/lightdm/.Xauthority
    elif [ -e /root/.xauth* ]; then # RHEL 6.7
            export XAUTHORITY=`ls /root/.xauth*`
    elif [ -e /var/run/gdm ]; then # ubuntu 10.04
            export XAUTHORITY=`ls /var/run/gdm/*/database`
    else
            export XAUTHORITY=`ls /home/*/.Xauthority`
    fi
    
    /usr/bin/eGTouchD
    
    exit 0

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.