【CANoe】最小構成のMBD事例 第2章 その268【仮想ECU連携⑤】

【CANoe】最小構成のMBD事例 第2章 その268【仮想ECU連携⑤】 事例
【CANoe】最小構成のMBD事例 第2章 その268【仮想ECU連携⑤】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回は、CANoeテストノードに記載するXCPセットアップ関連のCAPLコード開示。
ネットワークノードはイベントドリブン型、テストノードはシーケンシャル型とやや性格が違う。

今回はネットワークノードにXCP DAQ/STIM関連CAPLコード作成。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

ネットワークノード(Controller)に追加するXCP DAQ/STIM関連のCAPLコード

フクさん
フクさん

次はネットワークノードのControllerに追加するCAPLコマンド。

/*@!Encoding:932*/
includes
{
  
}

variables
{
  msTimer Timer1ms;
  double dTarget;
  double dInput;
  double dVoltage;
  message 2 xcp_rcv;
  int rcv_ev = 0;
}

on message 2
{
  dword dwVoltage;
  long lVoltage;

  if (this.byte(0)>0xC0){
    xcp_rcv = this;
    rcv_ev = 1;
  }else{
    // DAQ
    if( @daq_start ){
      if(this.byte(0) == 0){
        dwVoltage = this.byte(9) + this.byte(10)*0x100 + this.byte(11)*0x10000 + this.byte(12)*0x1000000;
        if( dwVoltage & 0x80000000 ){
          dwVoltage = ~dwVoltage;
          dwVoltage++;
          lVoltage = -dwVoltage;
        }else{
          lVoltage = dwVoltage;
        }
        dVoltage = lVoltage;
        dVoltage /= 0x10000;
      }
    }
  }
  
}

void sendrcvmessage2(byte sndData[],byte rcvData[])
{
  message 0x1 xcpmsg = {
    dlc = 0xF,
    FDF = 1,
    BRS = 1
  };
  int i,j;
  for( i = 0; i<64;i++ )
  {
    xcpmsg.byte(i) = sndData[i];
  }
  output(xcpmsg);
  rcv_ev = 0;  
}
void stim( dword target,dword input)
{
  byte targetLL;
  byte targetLH;
	byte targetHL;
  byte targetHH;
  byte inputLL;
  byte inputLH;
  byte inputHL;
  byte inputHH;
  byte sndmsg[64] = { 0x01, 0x00 };
  byte rcvdata[64];
  
  targetLL = (byte)(target & 0xFF);
	targetLH = (byte)((target/0x100) & 0xFF);
	targetHL = (byte)((target/0x10000) & 0xFF);
	targetHH = (byte)((target/0x1000000) & 0xFF);
	inputLL = (byte)((input) & 0xFF);
	inputLH = (byte)((input/0x100) & 0xFF);
  inputHL = (byte)((input/0x10000) & 0xFF);
	inputHH = (byte)((input/0x1000000) & 0xFF);
	sndmsg[1] = targetLL;
  sndmsg[2] = targetLH;
  sndmsg[3] = targetHL;
  sndmsg[4] = targetHH;
  sndmsg[5] = inputLL;
  sndmsg[6] = inputLH;
  sndmsg[7] = inputHL;
  sndmsg[8] = inputHH;
  
  sendrcvmessage2(sndmsg, rcvdata);
}


on signal Target
{
  //@sysvar::FMI::PID::Input::target  = getSignal(Target);
  dTarget = getSignal(Target);
}

on signal Speed
{
  //@sysvar::FMI::PID::Input::u = getSignal(Speed);
  dInput = getSignal(Speed);
}

on timer Timer1ms
{
   message 0x1 xcpmsg = {
    dlc = 0xF,
    FDF = 1,
    BRS = 1
  };
  dword dwTarget;
  dword dwInput;
  //setSignal(Voltage::Voltage, @sysvar::FMI::PID::Output::y);
  if( @daq_start ){
    dwTarget = dTarget*0x10000;
    dwInput = dInput*0x10000;
    stim(dwTarget,dwInput);
  }
  setSignal(Voltage::Voltage, dVoltage);
  
}

on start
{
  setTimerCyclic(Timer1ms,1,1);
}

ネットワークノード(Controller)に追加するXCP DAQ/STIM関連のCAPLコード確認

フクさん
フクさん

以前も言ったけど、CAPLのCAN送信/受信の機能を使って、無理やりXCPを実現している。

太郎くん
太郎くん

たしかDAQ/STIMのレイアウトも固定ってことだよね。
on message 2
stim
の2つの関数がそれぞれがDAQ受信、STIM送信になってそうだね。

フクさん
フクさん

あとはそれぞれのXCP関連のシグナルの単位
1/0x10000になっているので、そこの辻褄合わせてをDAQ/STIMそれぞれでやってる。

太郎くん
太郎くん

あー、確かに0x10000で割ったり掛けたりしてるよね。
そういう意味だったのか。

フクさん
フクさん

CAPLとしてはこんなもんだろう。

まとめ

フクさん
フクさん

まとめだよ。

  • ネットワークノード(Controller)に追加するXCP DAQ/STIM関連のCAPLコード開示。
    • CAPLのCAN送信/受信の機能を使って、無理やりXCPを実現。
  • on message 2でDAQ受信を実現、stimでSTIM送信を実現。
    • 同時にシグナル単位の単位変換も行っている。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました