バックナンバーはこちら。
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送信を実現。
- 同時にシグナル単位の単位変換も行っている。
バックナンバーはこちら。
コメント