|
DDEを使ってCalsat32の手足が増える CALST32の内部で計算している数値にはさまざまなものがあります。 DDEインターフェースはローテータやリグをコントロールするために必要になるものについて、外部から参照できるようにするための 機能です。
DDE(Dynamic Data Exchange)はWindowsのプログラム間でデータを交換するための方法のひとつで、実行速度は遅いものの簡単なプログラミングで実現することができます。
メニューバーの[コントロール][DDEインターフェース]をクリックすると、つぎのようなフォームが開きます。
表示の左半分のタイトルが右半分の数字の意味で、外部のプログラムから参照できる値としてはつぎのものがあります。
・衛星名 ・MJD(日付と時刻) ・衛星の方位と仰角(deg) ・距離(m) ・距離変化(m/s) ・MA ・周回番号 ・G系地心直交座標における衛星XYZ座標(m) ・太陽と月の方位と仰角(deg)
これらの値は、CALSAT32の画面で選択した衛星に連動し、計算値が更新されるたびに表示が替わります。
VisualBASIC(6.0)で作成したDDEコントロールを使うための例を示します。 Calsat32AzEl_DDE.zipをダウンロードして、解凍してください。
解凍したフォルダに含まれる"Calsat32AzEl_DDE.exe"を起動 すると、つぎのようなフォームが表示されます。
CALSAT32の値を参照するプログラムを実行する場合には、CALSAT32が起動している必要があります。
また、"Calsat32AzEl_DDE.vbp"をクリックすると Visual BASIC が起動して、つぎのコードを見ることができます。
Private Sub Form_Load()
'Calsat32とのリンクを設定します。 '以下の記述はDDEを使うときには必須の設定です。 'すべての項目をリンクする必要はありません。 'Text1. 〜 Text15. はフォームに貼り付けるテキストボックス名に合わせます。 '"Calsat32|Export" や "txtSatellite" などは以下の例と同じ文字列を指定します。
'衛星名 Text1.LinkTopic = "Calsat32|Export" Text1.LinkItem = "txtSatellite" Text1.LinkMode = 2
'MJD(日付と時刻) Text2.LinkTopic = "Calsat32|Export" Text2.LinkItem = "txtMJD" Text2.LinkMode = 2
'方位角(deg) Text3.LinkTopic = "Calsat32|Export" Text3.LinkItem = "txtAzimuth" Text3.LinkMode = 2
'仰角(deg) Text4.LinkTopic = "Calsat32|Export" Text4.LinkItem = "txtElevation" Text4.LinkMode = 2
'距離(m) Text5.LinkTopic = "Calsat32|Export" Text5.LinkItem = "txtRange" Text5.LinkMode = 2
'距離変化(m/s) Text6.LinkTopic = "Calsat32|Export" Text6.LinkItem = "txtRangeRate" Text6.LinkMode = 2
'MA Text7.LinkTopic = "Calsat32|Export" Text7.LinkItem = "txtMeanAnomaly" Text7.LinkMode = 2
'周回番号 Text8.LinkTopic = "Calsat32|Export" Text8.LinkItem = "txtRevolution" Text8.LinkMode = 2
'X座標 Text9.LinkTopic = "Calsat32|Export" Text9.LinkItem = "txtXg" Text9.LinkMode = 2
'Y座標 Text10.LinkTopic = "Calsat32|Export" Text10.LinkItem = "txtYg" Text10.LinkMode = 2
'Z座標 Text11.LinkTopic = "Calsat32|Export" Text11.LinkItem = "txtZg" Text11.LinkMode = 2
'太陽の方位角(deg) Text12.LinkTopic = "Calsat32|Export" Text12.LinkItem = "txtSunAzimuth" Text12.LinkMode = 2
'太陽の仰角(deg) Text13.LinkTopic = "Calsat32|Export" Text13.LinkItem = "txtSunElevation" Text13.LinkMode = 2
'月の方位角(deg) Text14.LinkTopic = "Calsat32|Export" Text14.LinkItem = "txtMoonAzimuth" Text14.LinkMode = 2
'月の仰角(deg) Text15.LinkTopic = "Calsat32|Export" Text15.LinkItem = "txtMoonElevation" Text15.LinkMode = 2
End Sub
Private Sub Form_Unload(Cancel As Integer)
'リンクを自動に戻す 'DDEの使用を終わるときに必要な設定です。
Text1.LinkMode = 0 Text2.LinkMode = 0 Text3.LinkMode = 0 Text4.LinkMode = 0 Text5.LinkMode = 0 Text6.LinkMode = 0 Text7.LinkMode = 0 Text8.LinkMode = 0 Text9.LinkMode = 0 Text10.LinkMode = 0 Text11.LinkMode = 0 Text12.LinkMode = 0 Text13.LinkMode = 0 Text14.LinkMode = 0 Text15.LinkMode = 0
End Sub
Private Sub Timer1_Timer()
Dim intYear As Integer, intMonth As Integer, intDay As Integer Dim intHour As Integer, intMin As Integer, intSec As Integer Dim vntDate As Variant, dblMjd As Double, lngDate As Long, lngSec As Long
'テキストボックスに値を取得します。 'データを取得する LinkRequest は必要なテキストボックスに対して行います。 'この例ではすべてのテキストボックスについて、1秒ごとに要求しています。 '要求の間隔は、Timer1 のプロパティーで設定しています。 'データはCalsat32のテキストボックスから、このプログラムのテキストボックスに取り込まれます。 'テキストボックスの表示が不要であれば、プロパティーの Visible を False にします。
Text1.LinkRequest '衛星名 Text2.LinkRequest 'MJD(日付と時刻) Text3.LinkRequest '方位角(deg) Text4.LinkRequest '方位角(deg) Text5.LinkRequest '仰角(deg) Text6.LinkRequest '距離変化(m/s) Text7.LinkRequest 'MA Text8.LinkRequest '周回番号 Text9.LinkRequest 'X座標(m) Text10.LinkRequest 'Y座標(m) Text11.LinkRequest 'Z座標(m) Text12.LinkRequest '太陽の方位角(deg) Text13.LinkRequest '太陽の仰角(deg) Text14.LinkRequest '月の方位角(deg) Text15.LinkRequest '月の仰角(deg)
'以下の部分は取得したデータの応用例です。 '必要に応じて、Val関数などで数値に変換して計算に使います。 '取得したデータを表示(方位と仰角)
lblAz.Caption = Format(Val(Text3.Text), "####.0") lblEl.Caption = Format(Val(Text4.Text), "####.0")
'MJDの整数部を年月日に変換 dblMjd = Val(Text2.Text) lngDate = Int(dblMjd) - 15018# vntDate = lngDate intYear = Year(vntDate) intMonth = Month(vntDate) intDay = Day(vntDate)
'MJDの小数部を時刻に変換 lngSec = (dblMjd - Int(dblMjd)) * 86400# intHour = Int(lngSec / 3600#) lngSec = lngSec - intHour * 3600# intMin = Int(lngSec / 60#) intSec = lngSec - intMin * 60#
'日時を表示します。 txtDateTime.Text = Format(intYear, "####") & "/" & Format(intMonth, "0#") & "/" & Format(intDay, "0#") & " " & Format(intHour, "0#") & ":" & Format(intMin, "0#") & ":" & Format(intSec, "0#") & "(UTC)"
End Sub
DDE基本的な考え方は、ソース(CALSAT32)のテキストボックスとディスティネーション(外部プログラム)にソースに対応する形でもうけられたテキストボックスをリンクして LinkRequest コマンドを実行したときに値が同期します。
外部プログラムが参照した値を使うには、Val関数で数値に変換した後に、演算処理を行うことになります。
また、馴染みの少ないMJDと呼ばれる日付と時刻を表す数値については、1日毎に1づつ数が増加する通算日で、少数点以下が0の時がUTCの0時になります。 応用としては、
・衛星、太陽、月の方位仰角データを利用したアンテナの自動制御 ・距離変化から任意の周波数でドップラーシフトを求めてリグコントロール ・XYZ座標から衛星位置の2次元、3次元表示
などはすぐに思いつくところですが、ご活用いただければと思います。 |