Beiträge anzeigen

Diese Sektion erlaubt es ihnen alle Beiträge dieses Mitglieds zu sehen. Beachten sie, dass sie nur solche Beiträge sehen können, zu denen sie auch Zugriffsrechte haben.


Nachrichten - PGmonster

Seiten: [1]
1
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 22. Juli 2009, 07:19:52 »
Hallo,

ich habe mal wieder eine neue Version zum Testen. Es werden jetzt beim Auftreten eines Alarmes/ einer Warnung die Alarmwörter/ Warnwörter am Baustein Schnittstelle_Danfoss angezeigt. Die Meldungen sind in einem Byte vom Typ enumALARM/ enumWARNUNG zusammengefasst. Somit wird die Meldung im Klartext am Baustein ausgegeben.
Wenn ein Kommunikationsfehler auftritt werden die Ausgänge des Bausteins auf FALSE und der Istwert auf 0.0 gesetzt.
Die Möglichkeit der Abfrage von beliebigen Parametern kommt noch.

Feedback ist wie immer erwünscht!

Grüße

Tobi

[gelöscht durch Administrator]

2
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 12. Juli 2009, 22:30:12 »
Hallo,

ich habe noch ein bisschen am Code gefeilt. In der aktuellen Version muss man in Com_Danfoss nur noch die RS485 bei den Konstanten anpassen (steht jetzt ganz oben). Bei den Aufrufen von Schnittstelle_Danfoss muss dann nur die Slaveadresse angegeben werden, fertig. Als nächstes ist ein vernünftiges Fehlerhändling und eine Parameterabfrage denkbar.
Besteht hierzu Interesse von jemandem außer von Daniel (WuFu). Sonst müllen wir das Forum nicht mehr weiter zu und mache das Ganze unter uns aus und posten vielleicht mal wieder eine neue Version.

Grüße

Tobi

[gelöscht durch Administrator]

3
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 06. Juli 2009, 16:04:21 »
Du hast Post!  ;D

4
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 06. Juli 2009, 10:30:49 »
Hallo Daniel,

sorry wg. dem Link. Habe ich erst gerade gelesen dass er nicht funktionierte.
Ich habe noch was gefunden, was interesant für Dich sein könnte. (-> siehe Anhang)

Gruß

Tobi

[gelöscht durch Administrator]

5
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 30. Juni 2009, 21:12:44 »
Hallo Daniel,

dieser Link sollte funktionieren: http://mcliterature.danfoss.com/WebPublish/doc_MG11B903.pdf
Das ist das Projektierungshandbuch für den FC100.
Bezüglich der weiteren Abfragen: Hast Du vor wenn dann immer die gleichen Parameter abzufragen oder sollten die variabel sein (z.B. immer Betriebszeit und Leistung und ...)? Das sollte relativ einfach durch Erweiterung des Sprungverteilers gehen. Ich denke noch mal drüber nach.

Gruß

Tobi

6
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 29. Juni 2009, 22:16:28 »
Hallo Daniel,

schau mal hier http://mcliterature.danfoss.com/WebPublish/downloadPub.do?no=0.
Auf Seite 141 stehen die Adressen für Steuer- und Zustandswort (Vergleiche Com_Danfoss.SlaveParameter...)
Man kann auch noch andere Parameter auslesen. Das wollte ich eigentlich auch noch einfügen (z.B. Stör- und Warnmeldugnen, aktuelle Leistung, ...). Nur da bin ich mir noch nicht schlüssig wie ich das am besten mache.
Zyklisch mit dem STW und ZSW oder azyklisch z.B. nur wenn Stör- oder Warnmeldungen anstehen oder einfach nur auf Anforderung.
Da kann man sich wirklich austoben.
Das ganze war bzw. ist für eine Klimaanlage mit sechs 30kw und einem 45 kW Lüfter. Momentan sind diese noch über alte Kompaktregler angesteuert. Wollte ich aber mit auf die Wago SPS hängen die schon andere Regelkreise regelt.

Grüße

Tobi

7
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 28. Juni 2009, 23:41:41 »
Hallo Daniel,

die Bausteine waren eigentlich für eine Anlage mit sieben FC100 Fu´s gedacht. Sieht man noch im Code vom Com_Danfoss bei den Var Constant. Ich hatte aber nur zwei FC300 zum Testen auf dem Schreibtisch.
Ich habe mal ein kleines Projekt angehängt, damit die Benutzung der Bausteine klarer wird.
Im Com_Danfoss bei den Var Constant müssen die SlaveAnzahl und die SlaveAdressen angegeben werden.
Bei SlaveParameter reicht es eigentlich die 7 nach dem := auf die Slaveanzahl zu setzen (hier sind es eben sieben).
Man muss noch die Modb_l05.lib von Wago einbinden.

Feedback erwünscht (auch von den Oscat Leuten!)

Grüß

Tobi

PS: Die Kommunikation läuft bei mir, aber im FU zeigt mir der Busfehlerzähler bei Parametrierung von mehr als einem Slave ständig Busfehler an. ???

[gelöscht durch Administrator]

8
Modulentwicklung / Module Development / Re: Danfoss RS485
« am: 28. Juni 2009, 14:00:37 »
Hallo Wu Fu,

ich habe mit schon mal eine Verbindung zu zwei Danfoss FC300 über Modbus RTU (RS485) aufgebaut. Allerdings nur zum Test auf dem Schreibtisch. Ich habe mir damals zwei Bausteine geschrieben:

Der erste Baustein wird in einer zyklischen Task aufgerufen und ist für die Kommunikation verantwortlich.
Der zweite Baustein wird irgendwo im Programm aufgerufen und stellt die Status- und Steuerbits zur Verfügung.

Hier mal der Code:

Baustein in Zyklischer Task (bei mir 10ms):

PROGRAM Com_Danfoss
VAR
ModbusMaster: MODBUSMASTER_RTU;
i: BYTE := 1; (*Schleifenzähler*)
Slaveadresse: BYTE; (*Slaveadresse in der Schleife*)
Aktion_RW: BYTE; (*Aktion lesen=0 / schreiben=1 / nächster Slave=2*)
FunctionCode: BYTE;
StartAddress: WORD;
NumberOfPoints: WORD;
StartFunction: BOOL;
Fehler: BYTE;
SlaveError: ARRAY [1..SlaveAnzahl] OF enumMB_ERROR;
SlaveData: ARRAY [1..SlaveAnzahl] OF SlaveData;
FU_Data: ARRAY [1..SlaveAnzahl] OF FU_Data;
xxB: POINTER TO BYTE;
test: BOOL :=FALSE;
END_VAR
VAR CONSTANT
SlaveAnzahl: BYTE := 7; (*wenn Änderung, dann Initalwerte anpassen*)
SlaveAdr: ARRAY [1..SlaveAnzahl] OF BYTE := 1,2,3,4,5,6,7;
SlaveParameter: ARRAY [1..SlaveAnzahl] OF AktParRW := 7(( Lesen:=( FunctionCode:=1,
StartAddress:=32,
NumberOfPoints:=32),
Schreiben:=( FunctionCode:=15,
StartAddress:=0,
NumberOfPoints:=32)));
(*Schnittstelle für Danfoss FU*)
ComPort: BYTE := 2;
ComBaudrate: COM_BAUDRATE := BAUD_19200;
ComParity: COM_PARITY := PARITY_EVEN;
ComStopbits : COM_STOPBITS := STOPBITS_1;
ComBytesize : COM_BYTESIZE := BS_8;
ComFlowControl: COM_FLOW_CONTROL := HALFDUPLEX;
ComTimeOut: TIME := t#20ms;
END_VAR

CASE Aktion_RW OF
(*Daten vom Slave lesen*)
0: Slaveadresse := SlaveAdr[i]; (*Slaveadresse*)
FunctionCode := SlaveParameter[i].Lesen.FunctionCode; (*Funktionscode für lesen*)
StartAddress := SlaveParameter[i].Lesen.StartAddress; (*Startadresse Statuswort*)
NumberOfPoints := SlaveParameter[i].Lesen.NumberOfPoints; (*Bereichslänge*)

IF NOT StartFunction THEN (*Warte auf Antwort vom Slave*)
IF SlaveData[i].Lesen.Data[1] = FunctionCode (*Funktionscode in Antwort gleich*)
AND SlaveData[i].Lesen.Data[0] = Slaveadresse (*Slaveadresse in Antwort gleich*)
AND NOT BYTE_TO_BOOL(Fehler) (*kein Fehler*)
THEN
(*Zustandswort eintragen*)
xxB := ADR(FU_Data[i].Zustandswort); (*Pointer für Zielbits*)
xxB^ := SlaveData[i].Lesen.Data[3];
xxB := xxB + SIZEOF(SlaveData[i].Lesen.Data[3]);
xxB^ := SlaveData[i].Lesen.Data[4];
(*Istwert eintragen*)
xxB := ADR(FU_Data[i].Istwert); (*Pointer für Zielbits*)
xxB^ := SlaveData[i].Lesen.Data[5];
xxB := xxB + SIZEOF(SlaveData[i].Lesen.Data[5]);
xxB^ := SlaveData[i].Lesen.Data[6];

Aktion_RW := 1; (*dann schreiben*)
(* StartFunction := 1;*)
test := 0;
RETURN;
ELSE
IF BYTE_TO_BOOL(Fehler) AND test
THEN SlaveError[i] := Fehler;
Aktion_RW := 2;
END_IF;
END_IF;
StartFunction := 1;
test := 1;
END_IF;

(*Daten zum Slave schreiben*)
1: Slaveadresse := SlaveAdr[i]; (*Slaveadresse*)
FunctionCode := SlaveParameter[i].Schreiben.FunctionCode; (*Funktionscode für schreiben*)
StartAddress := SlaveParameter[i].Schreiben.StartAddress; (*Startadresse Steuerwort*)
NumberOfPoints := SlaveParameter[i].Schreiben.NumberOfPoints; (*Bereichslänge*)

IF SlaveData[i].Lesen.Data[1] = FunctionCode (*Funktionscode in Antwort gleich*)
AND SlaveData[i].Lesen.Data[0] = Slaveadresse (*Slaveadresse in Antwort gleich*)
AND NOT BYTE_TO_BOOL(Fehler) (*kein Fehler*)
THEN
(*Steuerwort eintragen*)
xxB := ADR(FU_Data[i].Steuerwort); (*Pointer für Zielbits*)
SlaveData[i].Schreiben.Data[0] := xxB^;
xxB := xxB + SIZEOF(SlaveData[i].Schreiben.Data[0]);
SlaveData[i].Schreiben.Data[1] := xxB^;
(*Sollwert eintragen*)
xxB := ADR(FU_Data[i].Sollwert); (*Pointer für Zielbits*)
SlaveData[i].Schreiben.Data[2] := xxB^;
xxB := xxB + SIZEOF(SlaveData[i].Schreiben.Data[2]);
SlaveData[i].Schreiben.Data[3] := xxB^;

Aktion_RW := 2; (*dann schreiben*)
(* StartFunction := 1;*)
RETURN;
ELSE
IF BYTE_TO_BOOL(Fehler)
THEN SlaveError[i] := Fehler;
Aktion_RW := 2;
END_IF;
StartFunction := 1;
END_IF;

(*Nächster Slave*)
2: IF NOT BYTE_TO_BOOL(Fehler)
THEN  SlaveError[i] := Fehler;
Fehler := 0;
END_IF;
IF NOT StartFunction
THEN IF i >= SlaveAnzahl (*wenn letzter Slave erreicht*)
THEN i := 1; (*dann wieder erster Slave*)
ELSE i := i + 1; (*sonst nächster Slave*)
END_IF;
Aktion_RW := 0; (*danach lesen*)
test := 0;
END_IF;
END_CASE;

(*Modbusmaster für die Kommunikation mit den Slaves*)
ModbusMaster(
SlaveAddress:= Slaveadresse,
FunctionCode:= FunctionCode,
StartAddress:= StartAddress,
NumberOfPoints:= NumberOfPoints,
bCOM_PORT:= ComPort, (*VAR CONSTANT*)
cbCOM_BAUDRATE:= ComBaudrate, (*VAR CONSTANT*)
cpCOM_PARITY:= ComParity, (*VAR CONSTANT*)
csCOM_STOPBITS:= ComStopbits, (*VAR CONSTANT*)
cbsCOM_BYTESIZE:= ComBytesize, (*VAR CONSTANT*)
cfCOM_FLOW_CONTROL:= ComFlowControl, (*VAR CONSTANT*)
TimeOut:= ComTimeOut, (*VAR CONSTANT*)
StartFunction:= StartFunction,
ReceiveBuffer:= SlaveData[i].Lesen,
SendData:= SlaveData[i].Schreiben,
Error=> Fehler);

Baustein für jeden Fu aufrufen:

FUNCTION_BLOCK Schnittstelle_Danfoss
VAR_INPUT
(* Festsollwertanwahl_LSB: BOOL;
Festsollwertanwahl_MSB: BOOL;
Keine_DC_Bremse: BOOL;
Kein_Freilaufstopp: BOOL;*)
Kein_Schnellstopp: BOOL;
(* Keine_Freq_speichern: BOOL;*)
Start: BOOL;
Reset: BOOL;
JOG: BOOL;
(* Rampe_2: BOOL;
Daten_gueltig: BOOL;
Relais_1: BOOL;
Relais_2: BOOL;
Parametersatzwahl_LSB: BOOL;
Parametersatzwahl_MSB: BOOL;*)
Reversierung: BOOL;
rSollwert: REAL;
END_VAR
VAR_OUTPUT
Regler_bereit: BOOL;
Frequenzumrichter_betriebsbereit: BOOL;
Sicherheitsverriegelung: BOOL;
Alarm: BOOL;
Warnung: BOOL;
Ist_gleich_Soll: BOOL;
Autobetrieb: BOOL;
In_Freq_Bereich: BOOL;
Motor_ein: BOOL;
Spannungswarnung: BOOL;
Stromgrenze: BOOL;
Warnung_Uebertemp: BOOL;
rIstwert: REAL;
END_VAR
VAR
rSoll: REAL;
END_VAR
VAR_IN_OUT
FU_Data: FU_Data;
END_VAR

(*## Daten zu FU schreiben ##*)
FU_Data.Steuerwort.0 := FALSE; (*Festsollwertanwahl_LSB*)
FU_Data.Steuerwort.1 := FALSE; (*Festsollwertanwahl_MSB*)
FU_Data.Steuerwort.2 := TRUE; (*Keine_DC_Bremse*)
FU_Data.Steuerwort.3 := TRUE; (*Kein_Freilaufstopp*)
FU_Data.Steuerwort.4 := Kein_Schnellstopp;
FU_Data.Steuerwort.5 := TRUE; (*Keine_Freq_speichern*)
FU_Data.Steuerwort.6 := Start;
FU_Data.Steuerwort.7 := Reset;
FU_Data.Steuerwort.8 := JOG;
FU_Data.Steuerwort.9 := FALSE; (*Rampe_2*)
FU_Data.Steuerwort.10 := TRUE; (*Daten_gueltig*)
FU_Data.Steuerwort.11 := FALSE; (*Relais_1*)
FU_Data.Steuerwort.12 := FALSE; (*Relais_2*)
FU_Data.Steuerwort.13 := FALSE; (*Parametersatzwahl_LSB*)
FU_Data.Steuerwort.14 := FALSE; (*Parametersatzwahl_MSB*)
FU_Data.Steuerwort.15 := Reversierung;

(*Engangsignal auf Grenzwerte begrenzen*)
IF rSollwert > 100.0
THEN rSoll := 100.0;
ELSE IF rSollwert < 0.0
THEN rSoll := 0.0;
ELSE rSoll := rSollwert;
END_IF;
END_IF;
(*FU_Sollwert berechnen*)
FU_Data.Sollwert := REAL_TO_WORD(rSoll*163.8375);

(*## Daten von FU lesen ##*)
Regler_bereit := FU_Data.Zustandswort.0;
Frequenzumrichter_betriebsbereit := FU_Data.Zustandswort.1;
Sicherheitsverriegelung := FU_Data.Zustandswort.2;
Alarm := FU_Data.Zustandswort.3;
Warnung := FU_Data.Zustandswort.7;
Ist_gleich_Soll := FU_Data.Zustandswort.8;
Autobetrieb := FU_Data.Zustandswort.9;
In_Freq_Bereich := FU_Data.Zustandswort.10;
Motor_ein := FU_Data.Zustandswort.11;
Spannungswarnung := FU_Data.Zustandswort.13;
Stromgrenze := FU_Data.Zustandswort.14;
Warnung_Uebertemp := FU_Data.Zustandswort.15;

(*FU_Istwert berechnen*)
rIstwert := FU_Data.Istwert/163.8375;

Der Code beider Bausteine ist noch nicht ausgereift, aber vielleich hilft er ja jemandem.
Ich bin für Kritik, Verbesserungen und Anregungen offen

Grüße

Tobi


Seiten: [1]