2019年末からC#にはまっている。

昨年末からプログラミング言語C#にはまっている。できることはVBと大差ないということらしいけれどもC#の選択となった。VBはVBAと似ているので一見簡単そうに思えたけれどもコーディングがどうにもくどくて好きになれないのである。実は過去(1年前)に挫折していた。C#はオブジェクト指向型プログラミング言語ということでいろいろと説明を読むが用語がよくわからないカタカナばかりでまったくピンとこない。本当はわかりやすく説明できる人が日本にはいないのではないだろうかと思っている。ともかくピンとこないけれどもコーディングスタイルはこちらが好みである。{}が多くて無駄に行数ばかり増えるのが少々気になるけれども。ともかく目的が果たせたらいいのである。そんなことでC#でフォームアプリケーション作りから挑戦してみた。2桁までのかけ算表、コンテストタイマー(経過時間、残り時間などを表示)、電卓などていろいろな手法を試した後前々から作りたかった無線機の簡易コントロールと周波数、モード、出力の情報取得が簡単にできるアプリケーション作りに挑戦してみた。年末年始は、ずっとこれにはまって試行錯誤の繰り返しだった。USBシリアルとの非同期制御はいろいろと難しい。
コーディングとコンパイルに使っているのは、Visual Studio 2019 Communityだ。これは、無料で使える上有料版と大差ない。よく調べていなけれども何が違うのだろうか。いろいろと面倒くさいことを自動でやってくれるので便利ではある。細かい事をしたい人には大きなお世話なのかもしれないけれど。

無線機IC-7851のリモートコントローラーを作った。

今までHRDを使って無線機の周波数とモード情報を取得していた。本来は、ログの記録とかクラスターと連携して使うものだけれどほとんどその機能を活用してない。利用するつもりもまったくない。さらにコンテスト中に周波数変更などに追従できないて停止するという状態が頻繁に発生してどうにかしたいと思っていた。さらにCWキーヤー制御も直接できたらいろいろと便利。そもそも無線機には、USBシリアルポートで制御できる仕様になっているのでシリアル通信さえできたらなんとかなる。そういうことで18ページほどある無線機IC-7851のリモート機能仕様説明を読みながら本プログラム作りに取り組んだ。
何かはっきりした目的があればあれやこれと手を尽くして頑張って組んでしまうのである。

null

よく操作するボタン類を選択して配置した。この配置と配色に決まるまで何回も変更を繰り返した結果がこれである。ボタン配置と配色はなかなか難しい。

自分にとって一番難しくてよく理解してないところ。

それは、周波数とモードの表示部分だった。特に周波数は、無線機のVFOダイアルをクルクルと回した時に変化するのでそれに追従して表示できないとよろしくない。周波数が変化する毎に随時情報が無線機からシリアルポートに送られて来る。PC側は、その情報がシリアルポートに来たら表示処理を行うという非同期でマルチタスクな処理となっているためいろいろと面倒くさいことになっているようだ。処理が完了してないからダメみたいなエラー多発でどうしたものかない智恵を絞って考えたのがtimerを使って50ms事に周波数とモードが変化していたらそれを表示更新させるというものだ。取り敢えずそれで目的は果たせていたけれどもこれでは50ms(0.05秒)遅延しているということになる。これがどうにも気に入らない。さらにシリアルポートからり受信データ処理洩れもあるようだった。ではどうしたらいいのかということでネットやら本屋で買った厚い本やらで調べたらtask処理でawaitとかinvokeみたいなキーワードが気になってこれを使えはいいのかもということでお手本みながらコードを書き換えてみたらなんとちゃんと動作するようになった。

シリアルポートデータ受信時の処理部分

null

シリアルポートで受信したデータを周波数にして表示更新する処理部分。

null

実際問題何が功を奏したのかようわからないのだけれどもちゃんと動いている、なのでそのままにしても害はないようなのでこれでいいことにしておく。よく判らなくても目的が果たされたら問題ないのである。

他のボタン類は、ほとんど制御コマンドを送るためのものでそんなにややこしくない。バンド選択ボタンが少々面倒だったくらいだ。周波数は、書き換えられるとその数値の周波数にするコマンドが無線機に送られて変わってしまう。複数のコマンドをつづけて送信する時は、100ms(0,1秒)ほど間隔を空けないとコマンドを受け付けてくれないことも判明。そんなことは無線機の仕様書には書いてなかったけれども。

主な動作仕様

{}がやたらめったらと多くて改行してしまっているのでソースコードは1300行を超えてしまっている。実際大したことはやっていないけれどもそれぞれの動作仕様を文書にしたらとんでもなく長いものなりそうだ。主な動作部の動作説明を覚え書き程度に書いておく。配置したボタンは、クリックするとDarkCyanからDarkBlueに変化しその状態がアクティブであることを示す。それぞれの最終状態記録は、レジストリーキーを利用して行っている。なお弊局は電話運用をまったくしないので電信運用の利便性しか考えていない。

周波数表示部

一番難儀した周波数表示部だけれどもこれには、数字だけの入力制限と有効範囲が設定できるNumericUpDownというものを使った。右端の上下矢印ボタンで数字のアップダウンができるけれどもその量は、Incrementプロパティで変更できる。無線機のTS(Tuning Step)設定と同じなのでついでにそれに合わせた変化量の仕様にした。Up/Downで周波数を変更すると同時に無線機に周波数変更コマンドが送られて表示された周波数と同じになる。ということでこここに直接周波数が入力されても無線機の周波数が更新されることになる。

バンド選択ボタン

無線機の仕様書を隅々読んだけれどもバンド選択は、周波数指定するしかないようだった。どうしたものか考えた結果、無線機と同じようにバンドボタンをクリックするごとに3個の周波数とモードが記録されてるスタッキングメモリーみたいにしてこの問題を解決させたつもりだ。これでやっかいなのはそれぞれのバンドでいったい何番目のメモリーを使っていたかを記録しておく必要があることだ。無線機の周波数の変化に合わせてそれに合ったバンドボタンがアクティブになる必要がある。

TSボタンは、実際の無線機では周波数直接入力するためのF-INというボタンだけれどもそれは必要ないのでこのボタンをここに配置した。VFOのTunning Stepの変化量を変化させるものでクリックすると周波数の1HzからkHzの数字の上に配置した▼マークが合わせて移動する。

RIT/⊿TX

RIT(受信周波数シフト)、⊿TX(送信周波数シフト)ボタンとシフト量△9.999kHz~+9.999kHzまで変化させられるNumericUpDownを使った。変化量は。周波数表示部同様TSで胆沢した量になる。ボタンはクリックして有効になるとRITボタンは青色、⊿TXは赤色になる。両方可。それぞれのボタンがクリックされて有効になった時とシフト量が変化した時に無線機にコマンドが送られ同様の状態なる。NumericUpDownのダブルクリックでØになるのようにしたけれどもやたら反応するのでこれはやめた方がいいのかも。

VFO選択

VFOのMAINとSUBの選択、入れ替え、コピーがそれぞれのボタンで操作できる。MAIN/SUBいずれか選択された方の周波数とモードが表示される。

Dual/Splitボタン

D.WATCH は、無線機のDUAL WATCHをON/OFFにする。SPLITは、スプリット操作状態をON/OFFにする。

AF/RF GAIN

AF/RFゲインは、VFO選択でアクティブになったMAINまたはSUBで独立して変化しその量を記憶する。

TUNERボタン

クリックするとアクティブになってF.TUNE(強制チューニング)ボタンが有効になる。

他のグループのラジオボタン

Mode、Filter、BK-IN、RF Powerのそれぞれ選択したボタンの機能が選択されコマンドが無線機に送られその状態になる。RF Powerをのぞいてそれぞれ無線機の状態に合わせてそれぞれのボタンが選択された状態になる。

Memory Keyer

無線機本体のメモリー数に合わせて8個としそれぞれにTextBoxを用意した。対応したボタンもF1からF8まで用意クリックすると対応したメッセージが送出される。キーボードのF1~F8のキーもそれに対応。[MW]ボタンをクリックするとF1~F8のボタンがM1~M8と表記が変化してRyalBlueに変化する。この状態でそれぞのボタンをクリックすると無線機のメモリーが書き換えられる。メモリーキーヤー状態に戻す時は再度[MW]ボタンをクリックする。

Send messageの黄色TextBoxに英数字のメッセージを入力して[CW TX]ボタンをクリックすると内容が無線機から送出される。同様な動作は、CTRL-Sでメッセージ受け入れ。CSTL-Tで送出となっている。これは、主にExcelマクロ操作によるSendKeyで操作可能にするためである。

KEY SPEED NumericUpDown

これでCWの送出スピードが変更できる。6wpmから49wpmまで変更できる。他のボリューム類もそうだが実際には、0~255でそれを変化させることにになっている。このアプリを使ってCW送出する時は必ずここで設定したスピードにするコマンドを送ってからメッセージを送出させている。

Excelへデータ渡しが簡単になった。

特にExcel限定というわけではないけれどもこのアプリをアクティブにすると周波数、モード、出力がクリップボードに転記されるようになっている。なのでモード、周波数、出力を記入する直前にこのアプリを一瞬アクティブにするだけでいい。

無線機内蔵キーヤーからCW送出ができるようになった。

無線機のリモート仕様書を読んだらCWのメッセージ送出とかスピードコントロールができることが判ったのでCW関係の制御を付加した。いままでWinkeyer USBを使ってExcelから無理矢理な方法でCW送出操作をしていたけれども同様のことが簡単にできるようになった。

C#は難しいプログラミング言語なのか。

前述しているけれどもC#に関係する説明は、聞き慣れない英語をそのままカタカナにした用語が多い。ではその意味を調べてみるとこれまたよく判らないのである。特にオブジェクト指向型プログラミングということでそれに関係した用語が日本語であっても意味不明なものが多いと思う。C#の書籍も多数あるけれどもそれらを判りやすく説明しているものが見当たらない。自分の理解力のなさを思い知らされるけれども英語で生活している人にもよく理解されていないのではないかと思っている。ともかくこのなんのことやらさっぱり判らないカタカナ用語が多すぎて挫折する人多数というのもよく判る。納得である。そもそもそのオブジェクトて何??という人が多いと思う。一言で理解できるように説明できない。VBAでは、オブジェクト操作ばかりなのでさすがに薄々と判っているつもりである。クラスというのもよく登場する。クラスと言ったら学校のクラスを思い浮かべる人多数ではないだろうか。classは学級という意味でも分類という意味でもある。このプログラミング言語でいうクラスは多分ここでは「教室という定義、概念」と理解している。ひな形とも言うのだろうか。設計図とも説明されている。その定義に沿って1年1組、2年1組、3年1組という教室を定める、ということがインヘリタンス(inheritance:継承)するということのようだ。その継承された各教室に入る生徒や学年担任先生など決めることをインスタンス(instance)という言うらしい。実体という説明があった。教室の場所、生徒、担任先生、椅子、机、教壇、黒板などがプロパティ(Propaty:資産)ということだ。そしてよく登場する用語がメソッド(Method)である。日本語では、方式、方法とか訳されている。これがプロパティとよく混同してわけが判らなくなってしまう。この場合、各教室ごとの実施される学習科目や進行時間割がメソッドと理解している。授業が開始されると各教室のメソッドが実施(Run)されれるということだ。かようにプロパティとメソッドが揃ったものをオブジェクトと呼ぶということらしい。なんとなくもやぁと理解していただけただろうか。このようにオブジェクトの説明が長々となってわかけがわからなくなってしまうのである。これは、かなり怪しい理解かもしれない。

もっと身近なものだとTVのリモコンのボタンがオブジェクトだ。ボタンは同じような形のものが並べてあってそれぞれに数字だったり文字(プロパティ)が書かれてるいると思う。それぞれのボタンには異なる動作機能(メソッド)が備わっている。そして目的のボタンが押された時に発動すること(イベントドリブン)により用意されているメソッドまたはプログラムが実行されるのだ。これの動作指定定義のことをデリゲート(Delegate 使節)などという用語で説明されていて意味不明になってしまった。

そんなことでよく判らないカタカナ用語だらけでとっつきが悪いことは間違いない。これが多分日本語になるとますます何のことやらになってしまう予感がする。でもしかし用語をよく理解しなくても目的を果たすためにどうしたらいいのかは、ネット検索したらいっぱい用例があって参考になる。もちろん書籍にも詳しく書いてある。目的を果たすためにはどうしたらいいかを理解することが肝要だと思う。理解が深まるとたぶんコーディング効率がよくなるのではないかと思っている。C#そのものの文法とか形式は、判りやすくすっきりしていると個人的に思っている。{}が多いのも一つのルーチンの塊がこれで区切られているということなので慣れると判りやすい。できることが同じならば、プログラミング言語はなんだっていいいというのが個人的見解である。オブジェクト指向に関係する用語も言語の違いに関係なく似たようなものだと思う。私のような還暦ジジイでもこの程度のフォームアプリケーションを短期間の学習で作ることができるのだからC#は、手軽にWindowsアプリケーションを作ることができる高級言語だと思う。個人的には、データベース操作とWEB上で動作するASPプログラムが組めるようになることが目標である。こちらの分野もよく判らない用語だらけのようだ。

コメント