-> Hier kostenlos registrieren
Hallo, ich habe noch nicht viel Erfahrung mit Profibus und deren Kommunikation. Vielleicht könnt Ihr mir da ja helfen.
Ich habe ein Sensor der über Profibus angesteuert wird. Das Protokoll (Frame) zum steuern dieses Sensor ist 23 Byte groß
Der Frame sieht so aus
Ich habe die Bytes wie in der Doku beschrieben angelegt. Aber wie bekomme ich nun den Frame in die einzelnen Bytes rein bzw. könnte ich einfach den gesamten Frame an die erste Adresse schicken und die SPS weiß das der Rest zu den anderen Adressen gehört?
Ich hatte mir auch überlegt den Frame immer in 2 Zeichen zu splitten und dann diesen einfach an die jeweilige Adresse zu schicken.
Die Rückmeldung kommt dann genauso in diesem Frame zurück und die Antwort liegt dann in Byte 6-21...
Ich habe auch ein Beispiel in C in der Doku gefunden, damit kann ich aber nun garnix mit anfangen
Ich habe ein Sensor der über Profibus angesteuert wird. Das Protokoll (Frame) zum steuern dieses Sensor ist 23 Byte groß
Code:
Adresse: 50 - Byte 0 - Eröffnungsbyte 0xA5 Hexadezimal
Adresse: 51 - Byte 1 - Header Byte
Adresse: 52 - Byte 2 - Sender-Adresse
Adresse: 53 - Byte 3 - Empfänger-Adresse
Adresse: 54 - Byte 4 - Kommando Byte
Adresse: 55 - Byte 5 - Subkommando Byte
Adresse: 56...61 - Byte 6 bis 21 - Parameter / Rückgabewert
Adresse: 62...63 - Byte 22/23 - CRC Checksumme
Der Frame sieht so aus
Code:
A550000001000000000000000000000000000000000069EF
Ich habe die Bytes wie in der Doku beschrieben angelegt. Aber wie bekomme ich nun den Frame in die einzelnen Bytes rein bzw. könnte ich einfach den gesamten Frame an die erste Adresse schicken und die SPS weiß das der Rest zu den anderen Adressen gehört?
Ich hatte mir auch überlegt den Frame immer in 2 Zeichen zu splitten und dann diesen einfach an die jeweilige Adresse zu schicken.
Die Rückmeldung kommt dann genauso in diesem Frame zurück und die Antwort liegt dann in Byte 6-21...
Ich habe auch ein Beispiel in C in der Doku gefunden, damit kann ich aber nun garnix mit anfangen
Code:
Payload Definition sowie CRC Berechnung in C
Implementation of Payload in C
typedef union _PAYLOAD{
int data_i[4];
char data_c[16];
short data_s[8];
float data_f[4];
unsigned long long data_ull[2];
double data_d[2];
}PAYLOAD;
CRC polynom
𝑥𝑥16 + 𝑥𝑥15 + 𝑥𝑥2 + 1 (0xA001)
CRC calculation implementation (C implementation)
unsigned short crc16(unsigned short crc, unsigned char a)
{
int i=0;
crc&=0x0000FFFF;
crc^=a;
for(i=0;i<8;++i)
{
if(crc&1)
crc=(crc>>1)^0xA001;
else
crc=(crc>>1);
}
return crc;
}
CRC Frame enryption (C implementation – calling „crc16“ function)
#define VAC_FRAME_SIZE 24
#define CRC_16_SIZE 2
unsigned short crc_calc_16(char *buffer)
{
int i=0;
unsigned short crc_next=0xFFFF;
for(i=0;i<VAC_FRAME_SIZE-CRC_16_SIZE;i++)
{
crc_next=crc16(crc_next, buffer[i]);
}
return crc_next;
}