kurz zu meinen Geräten:
Ich besitze einen Raspberry 3 mit einem PIXtend-Board und einen Schrittmotor inklusive Motoransteuerung (Trinamic TMCM 1161).
Mein Problem dabei ist .... ich möchte den Motor über die PIXtend RS232-Schnittstelle mit den dazugehörigen Befehlen ansprechen. Der Motor selbst besitzt eine eigene Programmiersprache, jedoch kann ich den Motor sowohl über ASCII, als auch mit Bytes ansprechen. Ich hab mittlerweile zu Testzwecken ein Testprogramm vom CodeSys-Forum heruntergeladen, welches auch soweit wunderbar funktioniert mit einem RS232toUSB-Converter über Terminalprogramme am PC.
Sobald ich die RS232-Schnittstelle an den Motor anschließe und ihn versuch anzusteuern reagiert er überhaupt nicht. Sobald ich den Motor über ein Terminalprogramm mithilfe des RS232toUSB-Converter mit Befehlen anspreche führt er auch diese gewünschte Aktion aus. Ich habe danach sowohl das Signal des Terminalprogramms, als auch das RS232-Signal des PIXtend anhand eines Oszilloskop überprüft. Der Motor selbst steht zurzeit im ASCII-Modus, welcher über ASCII-Befehle direkt angesprochen werden kann.
Dabei unterschieden sich das Signal des Terminalprogramms vom Signals der RS232-Schnittstelle erheblichst. Die Frage dabei ist nur warum das so einen Unterschied macht obwohl ich jeweils eine Zeichenkette von ca. 10 Zeichen jeweils als Befehl eingebe? Wo liegt dabei mein Fehler um den Motor ansprechen zu können? bzw. Was muss ich dabei am Quellcode ändern um den Motor im ASCII-Modus ansprechen zu können? Ich bin noch halbwegs Anfänger was die ST-Programmiersprache angeht, daher bitte ich etwas um Eure Unterstützung.
Oder hat jemand schonmal Erfahrungen gemacht mit einem Motor von Trinamic bzw. mit Befehle senden über RS232-Schnittstelle?
Die Zeichenkette beläuft sich dabei auf z.B. AROR 0, 50
Das Testprogramm beinhaltet folgenden Quellcode:
Mit den Einstellungen 9600 Baud, 8 Datenbits, kein Paritätsbit und 1 Stopbit.
VAR_INPUT  slMode:SERIAL_LINE_MODE;  udiPort:UDINT;  udiBaudrate:UDINT;  sbStopBits:COM.STOPBIT:=COM.STOPBIT.ONESTOPBIT;  paParity:COM.PARITY:=COM.PARITY.EVEN;  sWriteText:STRING:='AROR0,50';  udiByteSize:UDINT;END_VARVAR_OUTPUT  sReadText:STRING;  errError:COM.ERROR;  xReadSuccess:BOOL;  xWriteSuccess:BOOL;  xClosed:BOOL:=TRUE;END_VARVAR  iState:INT;  tTimer:TON;  comOpen:COM.Open;(* Instance of the function block for opening a port *)  hCom:CAA.HANDLE;(* handle of the port*)  aParameter:ARRAY[1..7]OFCOM.PARAMETER;  comWrite:COM.Write;  (* Instance of the Write function block *)  bWriteBuffer:ARRAY[1..80]OFBYTE;(*Used to write data to the serial port*)  szWrite:CAA.SIZE;  comRead:COM.Read;(* Instance of the Read function block *)  bReadBuffer:ARRAY[1..80]OFBYTE;(*Used to read data from the serial port*)  szRead:CAA.SIZE;  comClose:COM.Close;(* Instance of the function block for closing a port *)END_VAR
CASEiStateOF    0:  //TheparameterfortheCOMPortsareset    aParameter[1].udiParameterId:=COM.CAA_Parameter_Constants.udiPort;    aParameter[1].udiValue:=udiPort;    aParameter[2].udiParameterId:=COM.CAA_Parameter_Constants.udiBaudrate;    aParameter[2].udiValue:=udiBaudrate;        aParameter[3].udiParameterId:=COM.CAA_Parameter_Constants.udiStopBits;    aParameter[3].udiValue:=sbStopBits;    aParameter[4].udiParameterId:=COM.CAA_Parameter_Constants.udiParity;    aParameter[4].udiValue:=paParity;    aParameter[5].udiParameterId:=COM.CAA_Parameter_Constants.udiTimeout;    aParameter[5].udiValue:=0;    aParameter[6].udiParameterId:=COM.CAA_Parameter_Constants.udiBinary;    aParameter[6].udiValue:=0;    aParameter[7].udiParameterId:=COM.CAA_Parameter_Constants.udiByteSize;    aParameter[7].udiValue:=udiByteSize;        iState:=1;      1:  //FirsttheCOMPortisopened    comOpen(xExecute:=TRUE,usiListLength:=SIZEOF(aParameter)/SIZEOF(COM.PARAMETER),pParameterList:=ADR(aParameter),hCom=>hCom);    xClosed:=FALSE;    IFcomOpen.xDoneTHEN      comOpen(xExecute:=FALSE);      //dependingonthemodethestateforreadingorwritingisset      IFslMode=SL_READORslMode=SL_READWRITETHEN        iState:=2;      ELSIFslMode=SL_WRITETHEN        iState:=4;      END_IF    ELSIFcomOpen.xErrorTHEN      errError:=comOpen.eError;      comOpen(xExecute:=FALSE);      iState:=32767;    END_IF      2://Thereadingprocessisstarted    comRead(xExecute:=TRUE,hCom:=hCom,pBuffer:=ADR(bReadBuffer),szBuffer:=SIZEOF(bReadBuffer));    IFcomRead.xDoneTHEN      szRead:=comRead.szSize;      //checkifthePorthassendsomething      IFszRead>0THEN        //thetextfromthereadbufferissavedinthesReadTextvariable        MEM.MemMove(ADR(bReadBuffer),ADR(sReadText),UDINT_TO_UINT(szRead));        MEM.MemFill(ADR(sReadText)+UDINT_TO_UINT(szRead),1,0);        xReadSuccess:=TRUE;      END_IF      //theflaghastobesettofalse,thatinthenextcylce,thereadtaskwillstartagain,bysettingittotrue      comRead(xExecute:=FALSE);      iState:=3;    ELSIFcomRead.xErrorTHEN      errError:=comRead.eError;      comRead(xExecute:=FALSE);      iState:=32767;    END_IF      3://Afterthereadingprocessisfinished,atimerisstartedforwaiting250milliseconds    tTimer(IN:=TRUE,PT:=T#250MS);    IFtTimer.QTHEN      tTimer(IN:=FALSE);      xReadSuccess:=FALSE;      IFslMode=SL_READWRITETHEN        iState:=4;      ELSE        iState:=2;      END_IF    END_IF      4://thewritingprocessisstarted    IFNOTcomWrite.xExecuteTHEN      szWrite:=INT_TO_UDINT(LEN(sWriteText));      //writethestringtothebufferfortheCOM.WRITEInterface      MEM.MemMove(ADR(sWriteText),ADR(bWriteBuffer),UDINT_TO_UINT(szWrite));    END_IF    comWrite(xExecute:=TRUE,hCom:=hCom,pBuffer:=ADR(bWriteBuffer),szSize:=szWrite);    IFcomWrite.xDoneTHEN      //theflagissettofalse,thatinthenextcylethisprocessisstartedagain,bysettingittotrue      comWrite(xExecute:=FALSE);        xWriteSuccess:=TRUE;      iState:=5;    ELSIFcomWrite.xErrorTHEN      errError:=comWrite.eError;      comWrite(xExecute:=FALSE);        iState:=32767;    END_IF      5://Afterthewritingprocessisfinished,atimerisstartedforwaiting250milliseconds    tTimer(IN:=TRUE,PT:=T#250MS);    IFtTimer.QTHEN      tTimer(IN:=FALSE);      xWriteSuccess:=FALSE;      IFslMode=SL_READWRITETHEN        iState:=2;      ELSE        iState:=4;      END_IF    END_IF      6://Closingtheports    IFhCom<>0THEN      comClose(xExecute:=TRUE,hCom:=hCom);      IFcomClose.xDoneTHEN        comClose(xExecute:=FALSE);        Fb_Init(FALSE,FALSE);      ELSIFcomClose.xErrorTHEN        errError:=comClose.eError;        comClose(xExecute:=FALSE);          iState:=32767;      END_IF    ELSE      Fb_Init(FALSE,FALSE);    END_IF  32767:    ;END_CASE
  FirstSerialLine(    slMode:=SL_READWRITE,    udiPort:=1,    udiBaudrate:=9600,    paParity:=COM.PARITY.NONE,    sbStopBits:=COM.STOPBIT.ONESTOPBIT,    udiByteSize:=8);
Vielen Dank schonmal.
Gruß
Chriis
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
kurz zu meinen Geräten:
Ich besitze einen Raspberry 3 mit einem PIXtend-Board und einen Schrittmotor inklusive Motoransteuerung (Trinamic TMCM 1161).
Mein Problem dabei ist .... ich möchte den Motor über die PIXtend RS232-Schnittstelle mit den dazugehörigen Befehlen ansprechen. Der Motor selbst besitzt eine eigene Programmiersprache, jedoch kann ich den Motor sowohl über ASCII, als auch mit Bytes ansprechen. Ich hab mittlerweile zu Testzwecken ein Testprogramm vom CodeSys-Forum heruntergeladen, welches auch soweit wunderbar funktioniert mit einem RS232toUSB-Converter über Terminalprogramme am PC.
Sobald ich die RS232-Schnittstelle an den Motor anschließe und ihn versuch anzusteuern reagiert er überhaupt nicht. Sobald ich den Motor über ein Terminalprogramm mithilfe des RS232toUSB-Converter mit Befehlen anspreche führt er auch diese gewünschte Aktion aus. Ich habe danach sowohl das Signal des Terminalprogramms, als auch das RS232-Signal des PIXtend anhand eines Oszilloskop überprüft. Der Motor selbst steht zurzeit im ASCII-Modus, welcher über ASCII-Befehle direkt angesprochen werden kann.
Dabei unterschieden sich das Signal des Terminalprogramms vom Signals der RS232-Schnittstelle erheblichst. Die Frage dabei ist nur warum das so einen Unterschied macht obwohl ich jeweils eine Zeichenkette von ca. 10 Zeichen jeweils als Befehl eingebe? Wo liegt dabei mein Fehler um den Motor ansprechen zu können? bzw. Was muss ich dabei am Quellcode ändern um den Motor im ASCII-Modus ansprechen zu können? Ich bin noch halbwegs Anfänger was die ST-Programmiersprache angeht, daher bitte ich etwas um Eure Unterstützung.
Oder hat jemand schonmal Erfahrungen gemacht mit einem Motor von Trinamic bzw. mit Befehle senden über RS232-Schnittstelle?
Die Zeichenkette beläuft sich dabei auf z.B. AROR 0, 50
Das Testprogramm beinhaltet folgenden Quellcode:
Mit den Einstellungen 9600 Baud, 8 Datenbits, kein Paritätsbit und 1 Stopbit.
Vielen Dank schonmal.
Gruß
Chriis