試験機の入出力を計算グラフで表現する
すべて入力複数、出力1つのノードと見なす
センサー出力にノードを噛ませて校正と物理量変換実現
入力元指定必須
ユーザーインプットを指定することで入力になる
出力先任意
指定するとモーター制御
frontendなどの試験制御プログラムも一種のノードとみなせる?
時刻データや応力履歴も使うからより複雑
近似的に見ればノードとみなせる
人間がセンサーの値を見てモーターを動かすのもノードとみなせる
問題
計算速度
設定に書いた式を事前にコンパイルみたいなことができればいいのだが
この程度の計算式なら大した速度低下にならないか?
概念の理解
校正設定、供試体高さなどの試験条件、出力設定がすべて同じ物として扱われている
煩雑さ
函数と有向グラフの概念にあわせようとするあまり、実用性が死んでないか? 拡張性や汎用性は高いと思うが……
少ない機能で幅広い試験システムを表現できる (はず)
履歴データを取り扱えない
特定の時刻におけるパラメタの関係をノードで表現している以上、他の時刻のデータを扱えない
逆にそれができるようになるとPID制御も書けるようになるが……そこまでするか?
ファイルが長くなりすぎたとき変更が面倒?
env:に変数を定義しておけば、ファイルが長くなっても変更はしやすい
変更頻度の違う設定の混在
供試体の密度や含水比を変えるたびに設定を書き換えなければならない
利点と捉えることもできる
1回の試験ごとに設定ファイルが変わるということは、試験と設定ファイルを1対1で紐づけられるということ
ステップコントロール
単純な一面せん断試験機でも
1. 圧密
2. 載荷
という2段階に別れる
2.での供試体寸法は圧密後の値を使いたい
どうやって設定ファイルに渡すか
それと試験機入出力設定とを組み合わせられないか
どこからどこを切り分けるかが悩ましい
もう入出力設定は校正だけにして、それ以外の計算はworkflow fileに書けばいいのでは
もう少し練り直したほうがいいかも
ステップコントロールの概念
レファレンス値
code:ideal.yml
# yaml-language-server: $schema=../config_schema.json
$schema: ../config_schema.json
# 0個以上の入力を受け取り、1個の出力を返すノード
nodes:
# 入力ポート定義
# 引数のないノードとして扱う
- name: 供試体の初期体積
id: volume_0
expression: 589048.6 # 出力する物理量の値を計算する式
unit: mm^3 # 出力する物理量の単位
# ↓省略可
# inputs: []
- name: 供試体の初期底面積
id: area_0
expression: 1963.5
unit: mm^2
# アナログ入力はAI_XXとして以下のように暗黙的に定義されたとみなす
# id: AI_00
# expression: <システム定義>
# unit: 1 # 無次元量
# 校正用ノード
# 要は生データを受け取って物理量に変換すればいい
- name: DTH-A-30
description: DTH-A-30の値
expression: raw * 0.000703225151 + 16.05431999
id: strain0
inputs:
raw: AI_00 # 定義済みの入力ポート
unit: mm
# 別の物理量への変換
# 軸差応力や固有値などもこの要領で計算できる
- name: 体積ひずみ
description: 変位計から計算した体積ひずみ
expression: strain * area_0 / volume_0
id: strain0
inputs:
strain: strain0
area_0: area_0
volume_0: volume_0
unit: 1 # expressionの結果と次元が一致していないとエラーにしたい (でも解析が重くなりそう)
# 出力ポート定義
- name: せん断力載荷装置のモーター
id: strain-clutch-motor
description: 0で停止、符号で正回転か逆回転かを表す
expression: arg
inputs:
# システムからの入力を表す特殊なID
# Frontendのユーザーからの入力、PID制御のcontrol valueの入力などに使われる
arg: {{ system_input }}
unit: rpm
# AO_XXは以下のようにシステムで定義したとみなす
# id: AO_00
# expression: {{ system_input }}
# unit: mV
# 仮想出力を実際のアナログ出力につなげるためのノード
# 校正の逆に相当する
- id: to-AO_00
description: strain-clutch-motorのON/OFF信号成分をAO_00に渡す
# 0VでOFF、5VでON
expression: arg == 0 ? 0 : 5
inputs:
arg: strain-clutch-motor
hidden: true # UIに表示しない (default: false)
output_port: AO_00 # 出力先ポート (default: undefined (出力先無))
unit: V # VかmVのみ。
# Vのときは、アナログ出力がmV単位指定なので、
# システム側で1000倍してからポートに書き込む
- id: to-AO_01
description: strain-clutch-motorの回転方向成分をAO_01に渡す
# 0Vで正回転、5Vで逆回転
expression: args >= 0 ? 0 : 5
inputs:
arg: strain-clutch-motor
hidden: true
output_port: AO_01
# 他のノードと重複不可
# output_port: AO_00 # Error: already used in "to-AO_01"
unit: V
- id: to-AO_02
description: strain-clutch-motorの回転速度成分をAO_02に渡す
# 東大生研式三軸試験機なら300 rpm/V
expression: abs(args) / 300
inputs:
arg: strain-clutch-motor
hidden: true
output_port: AO_02
unit: V
# output_portに指定されたポートはユーザー制御不能にする
# 出力先ポートが一つだけなら、電圧変換と出力先ポート指定を一つのnodeにまとめられる
- name: 垂直載荷用電空変換器
id: EP
# 出力先
expression: arg / 0.01275
inputs:
arg: {{ system_input }}
unit: kPa
output_port: A0_03
# 数値を変えるのがめんどくなる?
# env:を作るか?
env:
やりたいこと
inputsにセンサーのid、output_portに制御したいポートのidを書けば可能か?
積分制御に履歴がいるから、そう単純ではない
例:一面せん断試験
code:dst.yml
# yaml-language-server: $schema=../config_schema.json
$schema: ../config_schema.json
env:
INITIAL_SPECIMEN_DIAMETER: 10, cm CONSOLIDATED_SPECIMEN_HEIGHT: 30, cm nodes:
- name: 供試体の初期底面積
id: area_0
expression: INITIAL_SPECIMEN_DIAMETER ** 2 / 4 * Math.PI
unit: mm^2
- name: 供試体の初期体積
id: volume_0
expression: area * CONSOLIDATED_SPECIMEN_HEIGHT
inputs:
area: area_0
unit: mm^3
- name: 垂直変位
id: dH
expression: raw * 0.000703225151 + 16.05431999
inputs:
raw: AI_00
unit: mm
- name: せん断変位
id: ddelta
expression: raw * 0.000703225151 + 16.05431999
inputs:
raw: AI_01
unit: mm
- name: 垂直応力
id: sigma
# 校正と応力の計算をまとめた
expression: (raw * 0.51 + 16) / area
inputs:
raw: AI_02
area: area_0
unit: kPa
- name: せん断応力
id: tau
expression: (raw * 0.61 + 7) / area
inputs:
raw: AI_03
area: area_0
unit: kPa
- name: せん断力載荷装置のモーター
id: strain-clutch-motor
description: 0で停止、符号で正回転か逆回転かを表す
expression: arg
inputs:
arg: {{ system_input }}
unit: rpm
- id: to-AO_00
description: strain-clutch-motorのON/OFF信号成分をAO_00に渡す
# 0VでOFF、5VでON
expression: arg == 0 ? 0 : 5
inputs:
arg: strain-clutch-motor
hidden: true
output_port: AO_00
unit: V
- id: to-AO_01
description: strain-clutch-motorの回転方向成分をAO_01に渡す
# 0Vで正回転、5Vで逆回転
expression: args >= 0 ? 0 : 5
inputs:
arg: strain-clutch-motor
hidden: true
output_port: AO_01
unit: V
- id: to-AO_02
description: strain-clutch-motorの回転速度成分をAO_02に渡す
# 東大生研式三軸試験機なら300 rpm/V
expression: abs(args) / 300
inputs:
arg: strain-clutch-motor
hidden: true
output_port: AO_02
unit: V
- name: 垂直載荷用電空変換器
id: EP
expression: arg / 0.01275
inputs:
arg: {{ system_input }}
unit: kPa
output_port: A0_03
code:step-control.yml
steps:
runs-on: ubuntu-latest
strategy:
matrix:
steps:
- name: 供試体準備
until:
confirm: true # ユーザーの承認があるまで次に進まない
- name: 先行圧密
use: actions/monotonic-axial-loading # TypeScriptのmoduleを読み込ませる?
with:
compression: true
until: # この条件を満たしたら次のstepに進む
- name: 圧密開始
run: pnpm build
- name: 載荷開始
run: pnpm build
run:
必要な要素
機器入出力設定
試験中変化しない
供試体設定
試験中変化する
初期状態は変化しない (当然)
ステップコントロール
前のstepで計測したデータを次のstepが使えるようにする