組込みシステムとは

# はじめに
こんにちは！株式会社80&Companyの技術広報です。
弊社の開発部署では毎週火曜日の朝9:30から社内勉強会を行なっています。

今回の記事は前職で組込みシステムの開発を行っていた、社内のエンジニアが社内勉強会で「組込みシステムとは」というテーマについて発表したものを紹介します。

組込みシステムの概要やビット演算について興味のある方は、ぜひ参考にしてみて下さい♪

# 読者の対象
* 組込みシステムの開発について興味のある方
* ビット演算に興味のある方


# 組込みシステムについて！ざっくり概要
それでは、組込みシステムの概要についてざっくりと説明します！
組込みシステム技術協会で明記されているように、組込みシステムは『機器に組み込まれ、それを制御するコンピュータシステム』のことを指します。

パッと言われても難しいと思うので、下記の図に例を出しました。
スマートフォンのような通信機器、家にあるような電子レンジやエアコンのような家電機器などが組込みシステムです。

![スクリーンショット 2023-05-17 15.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/e1682caa-e63d-7898-a21f-d5bcc7817064.png)

上記のように組込みシステムの特徴を聞くと、組込みシステムと**IoT**を同期であると考える人が多いかもしれませんが、IoT=組込みシステムではありません。
IoTの正式名称は**Internet of Things**の略称であり、物がインターネットに繋がっていることを表します。

ちなみに**IoT**と言葉が似ている**IT**では意味が全く違うため、注意しましょう。
ITはInformation Technologyの略称です。

# 採用技術
では、実際に発表者がどういう技術を使用していたのかについて紹介します。

主にC言語を使う開発を行っていました。
Web画面を含む開発が増えてきており、その場合はPHPとフロント言語を使用した開発、またはC++、Javaを使用した開発を行いました。
OSに関しては、基本linuxベースのOSを使用し、Armadillo Base OSというDebianベースのOS、CentOS、ThreadX(RTOS)を使用していました。
WebサーバはApache、DBはPostgreSQLを使用していました。
通信プロトコルはHTTP、MQTT、ModbusTCP、ECHONET Lite、BacnetIP、ModbusRTUを用いていました。

![スクリーンショット 2023-05-31 13.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/14464eb5-647f-7314-46bb-534297451e0f.png)

通信プロトコルについては、もう少し補足します。

下記の図の青線で引かれているのは、通信のインターフェースが有線/無線LANで通信できるプロトコルであり、一般的なネットワーク機器と親和性が強みです。

ModbusRTUはインターフェースでいうと、RS485というものであり、電線2本で機器間を通信します。
USB-RS485変換器を使い、対向機器に挿して通信を行うという形です。
強みとしては、ノイズに強い点とリアルタイム性という点が挙げられます。

![スクリーンショット 2023-05-31 14.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/fb747357-6d21-923a-4371-b11137d7a629.png)

# 経験したプロジェクト その1
それでは、発表者が実際に経験したプロジェクトについて紹介します。
1つ目の内容としては、再生エネルギー事業の制御システムに関しての開発です。
開発では下図のクラウド、もしくはオンプレサーバやGWといった赤字で書かれていた部分のシステムを作っていました。

各家庭や施設には、太陽光パネル、蓄電池、電気温水器、電気自動車等のような機器が存在しますが、開発を行ったGW(ゲートウェイ)というものは各家庭に1台ずつ存在します。
また、GWがクラウド上、もしくはオンプレサーバ上にあるシステムと通信しているという構図が存在しています。

![スクリーンショット 2023-05-23 12.52.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/ccf27a54-3d77-b2f1-6387-768d5ada5d8e.png)

# 経験したプロジェクト　その2
次に、発表者が実際に経験したプロジェクトの2つ目について紹介します。
2つ目の内容としては、電気自動車の充電システムに関しての開発です。
開発では下図のクラウド、もしくはオンプレサーバやGWといった赤字で書かれていた部分のシステムを作っていました。

電気自動車の充電システムとしては制御盤親機、制御盤子機、電気自動車が存在します。
制御盤親機が家のブレーカー、制御盤子機は各部屋のキッチンのコンセントという構図が存在しています。

大元の制御盤親機がシステムの大きな電気容量を測り、契約している電気容量以上になるとブレーカーが落ちます。
![スクリーンショット 2023-05-23 13.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/39f35790-3afe-a08f-c93d-09c8b31b0628.png)

# よく使用する組込み特有(?)の技術
上記で関わった組込みシステム開発の中でも、頻繁に使用する特有の技術として、ビット演算について紹介します。

ビット(bit)とは0/1を表すものであり、コンピュータの情報における最小単位です。
下記の図を参考にビットについて説明します。
自然界上の塩に注目した場合、最小単位は素粒子であり、この素粒子がうまく組み合わさって構成されています。
しかし、コンピュータ界でAという文字に注目した場合、ビットとして「0100 0001」で表されます。

![スクリーンショット 2023-05-23 14.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/ca27aaaa-a1f7-ba93-b772-6a6bc21a7cea.png)

ビット演算とは、上記のビットを使用した論理演算のことです。

# ビット演算のメリット
ビット演算には下記の図のように、ANDやOR、XOR、NOTがあります。
結局使わない技術でしょ？と発表者も学んでいた際は思っていました。

![スクリーンショット 2023-05-23 14.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/2c151bb4-324d-a302-fdd1-fd411611700c.png)

しかし、発表者が実際に開発を行なっていた際に複数のメリットがありました。
そのメリットについて紹介します。

## 容量の節約
1つ目のメリットは、容量の節約です。
下記の図を参考にして説明します。
8個のエラー状態のON/OFFを管理したいという要望があった際に、1エラー1フラグで情報帯を持つために、フラグをa,b,c,d,e,f,g,hのように1個ずつ変数を定義し、各々でtrue falseという値の状態を持ちます。
そうすると1つのフラグが１バイトの場合、変数が8個存在するので、合計８バイトが必要です。

ところが8個のエラー状態のON/OFFを１フラグで管理した場合、1バイトは8ビットのため、1ビット目を状態Aのtrue,false、2ビット目を状態Bのtrue,falseで表し、1つのフラグで状態を管理することができます。

この手法を使用することによって、エラーの状態を1万台の機器から1分周期で収集・保存する場合、月間3.5GBから0.43GBに節約することができます。
![スクリーンショット 2023-05-23 14.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/a43edbbe-72f7-73f3-af16-8d4cd4d5bb5e.png)

## 複数の状態保持
2つ目のメリットは、複数の状態保持です。
下記の図を参考にして説明します。
左図のように1エラー1フラグの場合は、エラー検知とエラー判定にあまり問題がありません。
しかし、正常判定で全てのフラグを判定しようとする場合、フラグごとに記載が必要です。
関数呼び出しの場合でも同様です。
そのため、変数の管理が大変です。

右図のように1フラグで管理を行う場合は、1つの変数の使用で済む場合は、ループ処理と相性がいいです。
そのため、実装のコードのステップ数を減らすことができたり、重複した処理を避けることができます。

![スクリーンショット 2023-05-23 14.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3059557/ffe39834-c6d6-1904-e2df-7271f6d48bde.png)

# 最後に
今回は、弊社社内勉強会で発表された「組込みシステムとは」について扱いました。
ビット演算に関しては、色んな手法を知って使用する選択肢を増やすことができれば便利ですね。

今後も継続的に80&Companyでの技術的な取り組みを発信していきます！
[Qiita Organization](https://qiita.com/organizations/80andco)や[Twitter](https://twitter.com/80andcoDev)公式アカウントのフォローもよろしくお願いいたします！
最後まで読んでいただきありがとうございます！

# 参考文献
https://www.jasa.or.jp/