Zeitüberschreitung
-
Guten Morgen,
Ich würde gerne bei mein Code eine Zeitüberschreitung mit einbinden.
In dem Code frage ich jeden Ausgang der Platine ab und lege sie im vector ab, wenn er jetzt z.b mehr wie 2 sek für den Ausgang braucht würde ich gerne eine
Fehlermeldung haben , den Ausgang mit 0 schreiben und zum nächsten gehen.
Ich weis blos ehrlichgesagt nicht mal einen Ansatz wie ich das machen könnte.#include <iostream> #include <cstdlib> #include <cctype> #include <ctime> #include <fstream> #include <iterator> #include <vector> #include <string> #include <sstream> #include <panel.h> #include <curses.h> #include <bwctmb/bwctmb.h> using namespace std; int main (int argc, char *argv[]); /*** offene Variabeln ***/ vector<bool> input , output , output_tmp; /*** Bus (Netzwerk) IP der jeweligen Netzwerkkarte ***/ Modbus mb0("192.168.55.110", "502"); // Mac 00:0E:42:02:00:E1 Modbus mb1("192.168.55.107", "502"); // Mac 00:0E:42:02:00:E2 Modbus mb2("192.168.55.112", "502"); // Mac 00:0E:42:02:00:E3 Modbus mb3("192.168.55.109", "502"); // Mac 00:0E:42:02:00:E4 Modbus mb4("192.168.55.103", "502"); // Mac 00:0E:42:02:00:E5 Modbus mb5("192.168.55.108", "502"); // Mac 00:0E:42:02:00:E6 Modbus mb6("192.168.55.111", "502"); // Mac 00:0E:42:02:00:E7 Modbus mb7("192.168.55.105", "502"); // Mac 00:0E:42:02:00:18 /***************************************************************************** * Funktionen zum Auslesen der Aus-& Eingaenge und schreiben der Eingänge * *****************************************************************************/ void readinputs () { input.clear(); for (int i = 0; i < 8; i++) { for (int ii = 0; ii < 16; ii++) { if (i == 0) {input.push_back(mb0.read_discrete_input(255, ii));} if (i == 1) {input.push_back(mb1.read_discrete_input(255, ii));} if (i == 2) {input.push_back(mb2.read_discrete_input(255, ii));} if (i == 3) {input.push_back(mb3.read_discrete_input(255, ii));} if (i == 4) {input.push_back(mb4.read_discrete_input(255, ii));} if (i == 5) {input.push_back(mb5.read_discrete_input(255, ii));} if (i == 6) {input.push_back(mb6.read_discrete_input(255, ii));} if (i == 7) {input.push_back(mb7.read_discrete_input(255, ii));} } } } void readoutputs () { output.clear(); output_tmp.clear(); for (int i = 0; i < 8; i++) { for (int ii = 0; ii < 16; ii++) { if (i == 0) {output.push_back(mb0.read_coil(255, ii));} if (i == 1) {output.push_back(mb1.read_coil(255, ii));} if (i == 2) {output.push_back(mb2.read_coil(255, ii));} if (i == 3) {output.push_back(mb3.read_coil(255, ii));} if (i == 4) {output.push_back(mb4.read_coil(255, ii));} if (i == 5) {output.push_back(mb5.read_coil(255, ii));} if (i == 6) {output.push_back(mb6.read_coil(255, ii));} if (i == 7) {output.push_back(mb7.read_coil(255, ii));} output_tmp = output; } } } void writeoutputs () { for (int i = 0; i < 128; i++) { if (output[i] != output_tmp[i]) { int platine = i/16; int platinenoutput = i-(platine*16); if (platine == 0) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 1) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 2) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 3) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 4) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 5) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 6) {mb0.write_coil(255, platinenoutput, output[i]);} if (platine == 7) {mb0.write_coil(255, platinenoutput, output[i]);} } } } /***************************************************************************** * Funktionen Meldungen * *****************************************************************************/ void ende() { input.clear(); output.clear(); output_tmp.clear(); endwin(); cout <<"Programm beendet durch Benutzer\n"; } /***************************************************************************** * MAIN menu * *****************************************************************************/ int main(int argc, char *argv[]) { readinputs(); readoutputs(); writeoutputs(); }
mfg Michael
-
Die Funktion zum Lesen der Ausgänge ist vermutlich nicht von dir? Kannst du da nicht ein Timeout festlegen oder sowas? Zur Not könnte man überlegen, diese Aufrufe in einen eigenen Thread zu legen und diesen nach 2 Sekunden abzuschießen. Ist aber nicht so schön...
-
Also diese Funtionen die du hier im code siehst habe ich heschrieben, die Modbus funktion wird mir vorgebene wie Sie aufgebaut ist : Modbus bezeichung (IP,port)
Ich könnte auch 16 Eingänge oder Ausgänge zusammen einlesen aber ich weis nicht wie ich die dann im Vector copiere so das er dennoch alle einzelnd im Vector hat, deswegen lese ich alle einzelnd ein.
Timeout funktion ist mir nicht bekannt, Im eigenen tread die Abfrage ?
nachteil wäre das er allgemein ja ein Error macht und nicht evtl einzelnd.Mfg Michael
-
Brusko schrieb:
Also diese Funtionen die du hier im code siehst habe ich heschrieben, die Modbus funktion wird mir vorgebene wie Sie aufgebaut ist : Modbus bezeichung (IP,port)
Ich könnte auch 16 Eingänge oder Ausgänge zusammen einlesen aber ich weis nicht wie ich die dann im Vector copiere so das er dennoch alle einzelnd im Vector hat, deswegen lese ich alle einzelnd ein.
Das solltest du auf jeden Fall. Könnte ca. so aussehen:
std::vector<bool> input; SArray<bool> tmp; for (int i = 0; i < 8; i++) { tmp = modbus_vector[i].read_discrete_inputs(255, 0, 16); for (int bit = 0; bit < 16; bit++) input.push_back(tmp[bit] != 0); }
Timeout funktion ist mir nicht bekannt, Im eigenen tread die Abfrage ?
nachteil wäre das er allgemein ja ein Error macht und nicht evtl einzelnd.Mfg Michael
Den letzten Satz verstehe ich überhaupt nicht.
-
mit dem Satz (timeout) meinte ich nun, wenn die Abfrage der Platine oder Ausgänge länger als z.b 2 sekunden dauert das dann ein Fehler gemeldet wird.
std::vector<bool> input; SArray<bool> tmp; for (int i = 0; i < 8; i++) { tmp = modbus_vector[i].read_discrete_inputs(255, 0, 16); for (int bit = 0; bit < 16; bit++) input.push_back(tmp[bit] != 0); }
dann müste ich hier doch zb den modbus_vector[0] noch zuorden Modbus mb(ip ,502) oder ?
bin zurzeit nicht zuhause um zu zu probieren.Ich hatte immer versucht den komletten Satz SArray im Vector zu kopieren und nicht wie hier einzelnt.
mfg Michaeö
-
input.push_back(tmp[bit] != 0)
aber wofür ist denn überhaubt != 0 dadrin ?
heist das füge tmp[bit] wenn es nicht den wert null hat ?tmp = mb_vector[i].read_discrete_inputs(255, 0, 16)
wenn ich nun mit
vector<string> mb_vector; mb_vector.push_back("mb0");
dem Vector mb0 zuordne gibt er mir aber Fehler aus
has no member named read_discrete_inputsbislang habe ich den code so damit ich jeden platine einmal auslese und dann einzelnt die ausgänge schreiben kann.
void readinputs () { input.clear(); SArray<bool> tmp; for (int i = 0; i < 8; i++) { if (i == 0) {tmp = mb0.read_discrete_input(255, 0, 16)}; if (i == 1) {tmp = mb1.read_discrete_input(255, 0, 16)}; if (i == 2) {tmp = mb2.read_discrete_input(255, 0, 16)}; if (i == 3) {tmp = mb3.read_discrete_input(255, 0, 16)}; if (i == 4) {tmp = mb4.read_discrete_input(255, 0, 16)}; if (i == 5) {tmp = mb5.read_discrete_input(255, 0, 16)}; if (i == 6) {tmp = mb6.read_discrete_input(255, 0, 16)}; if (i == 7) {tmp = mb7.read_discrete_input(255, 0, 16)}; for (int platineninput = 0; platineninput < 16; platineninput++) {input.push_back(tmp[platineninput]);} }
schön wäre es ja wenn ich anstatt immer mb1 bis mb7 das auch noch in eine schleife packen könnte
-
OMG, bitte lern programmieren
-
nun ich versuchs ja
bin ja auch ein Anfänger, und komme da leider viel zu selten bei