Ich arbeite an einem CAPL-Skript, das alle Nachrichten auf einem CAN-C-Kanal übertragen und die Übertragung einer bestimmten Nachricht aus der Datenbankdatei verhindern soll. Kann jemand mit der Methode/Funktion/Code helfen, die ich verwenden kann?CAPL Scripting - CAN C Kommunikation (Übertragung einer Nachricht von DBC stoppen)
Antwort
Ihre Frage ist vage, aber ich gehe davon aus, dass Sie von einem CAN-Kanal zum anderen gehen. Zum Beispiel können C zu CAN D (oder CAN 3 bis CAN 4), als Sie tun können:
on message CAN3.0x7FF // This would be that one ID that stops at some point
{
message CAN4.0x7FF msg;
msg = this;
// Assuming you are receiving on CAN 3, and looking to transmit on CAN 4
if(this.dir == rx)
{
// Declare a global variable that sets to 1 when you want it to stop
if(MSG_STOP == 0)
output(msg);
}
}
on message CAN3.*
{
message CAN4.* msg;
msg = this;
if (this.dir == rx)
{
output (msg);
}
}
AFAIK, der einzige Weg, dies zu erreichen, ist die automatische Übertragung von Nachrichten (z. B. über die IG oder Network IL) zu deaktivieren und alle Nachrichten manuell von Ihrem CAPL-Skript in Timer Callbacks zu übertragen. Die Übertragung kann mit der Funktion output
erfolgen. Je nach den von Ihnen definierten Kriterien können Sie wählen, dass Sie für keine Nachrichten, die blockiert werden sollen, output
anrufen.
Wenn Sie das Interaction Layer (IL) in Ihrer Simulation verwenden und die DBC-Datei zyklische Zeiten sind richtig konfigurierten gibt es einige CAPL Funktionen, die für die Fehlerinjektion verwendet werden können, die Sie selektiv ermöglicht starten/stoppen bestimmte Nachrichten zu übertragen:
on sysvar Sys_m0x461_Send {
/**********************************************************
* FAULT INJECTION Enable/Disable Msg Sending
**********************************************************/
if (@this) {
ILFaultInjectionEnableMsg(Message0x461fromDBC);
}
else {
ILFaultInjectionDisableMsg(Message0x461fromDBC);
}
}
im Beispiel, wenn die Systemvariable (mit einem Control Panel verbunden werden kann, zB Checkbox) gleich "1" wird die Nachricht wie im DBC definiert übertragen, ansonsten wird das Senden der Nachricht gestoppt.