修士論文

熱変形能動補償型高精密
マシニングセンタによる加工精度向上の研究

１〜１１４ページ 完

平成１５年 １月３０日

指導教官

長尾高明教授

知能機械コース １０５５０４２
更谷 謙仁

1

目次

2

目次

1

2

3

4

序論
1.1 研究の背景 ・・・・・・・・・・・・・・・・・・・・・・・5
1.2 従来の研究 ・・・・・・・・・・・・・・・・・・・・・・・6
1.3 加工の知能化の概念 ・・・・・・・・・・・・・・・・・・・7
1.3.1 マシニングセンタにおける熱変形能動補償の意義 ・・・８
1.3.2 高精密マシニングセンタの有すべき機能 ・・・・・・・９
1.4 本研究の目的 ・・・・・・・・・・・・・・・・・・・・・・11
1.5 本論文の構成 ・・・・・・・・・・・・・・・・・・・・・・12
高精密マシニングセンタの構成
2.1 システムの概略 ・・・・・・・・・・・・・・・・・・・・・14
2.2 マシニングセンタ ・・・・・・・・・・・・・・・・・・・・15
2.3 変形検出機構（変形センサ） ・・・・・・・・・・・・・・・18
2.3.1 システムの概略 ・・・・・・・・・・・・・・・・・18
2.3.2 変形センサとは ・・・・・・・・・・・・・・・・・18
2.3.3 変形センサの設計 ・・・・・・・・・・・・・・・・20
2.3.4 変形センサの製作 ・・・・・・・・・・・・・・・・26
2.3.4.1 ストレインゲージ ・・・・・・・・・・・28
2.4 ストレインアンプ ・・・・・・・・・・・・・・・・・・・・29
2.5 A/D 変換ボード ・・・・・・・・・・・・・・・・・・・・・31
2.6 熱アクチュエータ ・・・・・・・・・・・・・・・・・・・・33
2.7 歪測定プログラム ・・・・・・・・・・・・・・・・・・・・37
2.8 遠隔制御プログラム ・・・・・・・・・・・・・・・・・・・38
2.9 変形センサの設置 ・・・・・・・・・・・・・・・・・・・・41
姿勢制御の手法
3.1 基本変形モード ・・・・・・・・・・・・・・・・・・・・・43
3.2 マシニングセンタ姿勢制御法 ・・・・・・・・・・・・・・・44
変形センサの性能評価
4.1 ハードウェアの性能評価 ・・・・・・・・・・・・・・・・・46
4.2 変形センサの性能評価 ・・・・・・・・・・・・・・・・・・46
4.3 熱アクチュエータの性能評価 ・・・・・・・・・・・・・・・52
4.4 結果及び考察 ・・・・・・・・・・・・・・・・・・・・・・55

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

3

目次

5

熱アクチュエータによる姿勢制御
5.1 主軸回転時の熱変形測定 ・・・・・・・・・・・・・・・・・57
5.2 熱アクチュエータでの熱変形測定 ・・・・・・・・・・・・・60
5.3 姿勢制御プログラムによる熱変形補償実験 ・・・・・・・・・64
5.4 結果及び考察 ・・・・・・・・・・・・・・・・・・・・・・67
6 総括と展望6.1 姿勢制御のためにハードウェアとして有している性能 ・・・・69
6.2 展望 ・・・・・・・・・・・・・・・・・・・・・・・・・・70
7 結論
7.1 結論 ・・・・・・・・・・・・・・・・・・・・・・・・・・72
謝辞
謝辞 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・73
参考文献
参考文献 ・・・・・・・・・・・・・・・・・・・・・・・・・・74

付録
付録

・・・・・・・・・・・・・・・・・・・・・・・・・・・・75

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

4

第1章
序論

5

第１章

1.1

序論

研究の背景

古代から我々人類は頭と手を使って人間の暮らしに役立つものを作ってきた。
やがて、道具により道具を作るようになってきた。そして、機械化の進んだ現在、道具を作る道具も機械となった。それはマザーマシンと呼ばれ、母性原理の働く生産の場で、高精度の製品を生産するために高水準の生産性や信頼性が要求されている。
時代は、高度経済成長を終え、空前の低成長時代に突入して久しくなる。また、物質的な豊かさを手に入れた我々の中では、精神的な豊かさを求めて環境問題への興味・関心が非常に高まっている。このような時代背景の中、生産の現場にはより高効率な製品、より高精度な製品への要求がますます増加している。
しかし、高精度な生産を担ってきた熟練労働者は減少の一途をたどっている。
その背景には、熟練者でなくては高い水準の加工ができなかった汎用工作機械
から工作機械のＮＣ化によって、本やマニュアルを読んだだけで一定の加工ができるようになり、また 1 日 24 時間の生産が可能になったことも一因である。
しかし、熟練者が全く必要でなくなったのではなく、高い精度が要求される加工では、熟練者の経験は必要不可欠である。
加工の高精度化、高信頼性への要求が高まる中で、工作機械が熱や加工反力
より変形し精度が低下する問題は未だ解決されておらず、熟練者の経験に依存しており、高生産性を実現できていない。
実際、工作機械の熱変形による精度の低下に対し、加工中に発生する熱を冷却することによって抑えてはいるが、発生する全ての熱を解消することは不可能である。熟練者が経験に基づいて補正を加えるか、あるいは機械を事前に数時間ほど空運転することによって熱変形が安定するのを待って使用するといった方法で対処しているのが現状である。
熱変形そのものを抑制する手段はいくつか講じられているが、熱伝播、熱膨張を全くなくすことが出来ない限り精度低下は起こってしまう。
そこで、発熱を抑制するだけでなく工作機械の熱変形を補償し、熱環境に依存しない工作機械をつくりだそうという研究があり、本研究はマシニングセン
タにおいて、熱変形による精度低下を低減する試みである。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

6

第１章

1.2

序論

従来の研究

工作機械の精度を下げる要因のうち、熱変形の占める割合がかなり大きいことは古くから知られていた。それ以来、熱変形の要因を調べる研究がなされてきた。現在では、有限要素法を利用して機械本体の熱変形挙動を解析する研究なども挙げられる。
一方、熱変形に対抗して加工精度の向上を目指す試みも数多くある。それらは大きく２つに分類される。１つには熱変形を抑制する研究。もう１つは熱変形による精度低下に対し補正を行う研究が試みられている。
前者には、コンクリートのように熱伝導率の小さい材質を構造部に用いて熱変形を抑えようとする研究などが挙げられる。後者の例としては、圧電素子を用いて熱変形を補正しようとした研究がある。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

7

第１章

1.3

序論

加工の知能化の概念

加工の目的は所望の寸法をもつ製品をできるだけ正確に効率よく作り出すことであるが、「正確に」「効率よく」を実現するのは、実際には非常に困難な問題である。その原因として挙げられるのが図 1.1 に示すような加工中に生じる様々な物理現象である。

図 1.1

加工中に生じる物理現象

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

8

第１章

序論

マシニングセンタを始めとする工作機械はこれらの物理現象によって生じる力と熱によって変形し、同時に歪、温度、音などの情報を発生する。そこで、これらの情報をセンサによって取り込み、設計に関する知識に基づいて処理することで目標値と実際のずれを予測し、機械に設置したアクチュエータによってそのずれを修正することができれば製品を正確に作り出すことが可能になる。
また、センサ情報、アクチュエータの動作内容、加工の結果をデータベース化し、それに基づいて予測のための内部モデルを修正することで、システム自体が学習、自己進化することも実現可能である。このような考えを「加工の知能化」と呼びその基本構成は図 1.2 のダイヤグラムに示すようなものとなる。

図 1.2 加工の知能化の基本構成

1.3.1

マシニングセンタにおける熱変形能動補償の意義

前途したように様々に物理現象が加工中に生じているわけだが、このうちマシニングセンタの加工精度を低下させる大きな要因として、加工反力による変形、熱による変形を挙げることができる。
このうち加工反力による変形に対処するために、従来は工作機械本体の剛性
2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

9

第１章

序論

を高めることによって変形を抑えるという方法がとられてきた。しかしこの方法では、材料の剛性に限界があることや、構造体の重量が重くなり過ぎることなどの制約があり、根本的な解決には至ってない。
一方、もう１つの要因として取り上げた熱変形については、従来は発熱する部分を冷やす、あるいは熱が他の部分に伝わるのを出来るだけ抑制する、といった対策を施すことで少しでも変形を軽減しようとしていたが、発生した熱を全て冷却することが出来ない以上、おのずから限界ができてしまう。事実、加工することなく単に主軸を回転させるだけでも、わずか 2 時間で 40〜50μm もの主軸変位が発生する。
実際には、主軸モータの発熱に加え、工具と披加工物との間に生じる加工発
熱、周囲の環境の変化に伴う熱の移動など、さらに多くの熱変形の要因が存在しており、これらを全て取り除くことは不可能である。
また、マシニングセンタのように多くの部品と複雑な構造で構成されるもの
ででは、加工反力による変形と熱変形を具体的に解析し、モデル化することは非常に困難である。よって、モデル化による熱変形補正は複雑な熱変形を十分に補正できない。
しかし、実際問題として加工の高精密化が必要されている現状では、これらの変形による加工精度の低下は解決されなければならない問題である。そこで本研究では、「加工の知能化」の概念に基づいて、マシニングセンタの熱によって生じる変形を能動的に補正することを試みていく。

1.3.2

高精密マシニングセンタの有すべき機能

以上のことを踏まえて、加工の知能化を実現するために、マシニングセンタが備えているべき機能を抽出すると以下のようになる。
1. 自ら変形情報を把握するためのセンサを有すること。
2. センサによって得られた情報に基づいて、加工中にリアルタイムに自己の変形状態を導き出すモデルを持っていること。
3. モデルによって得られた構造体変位を打ち消すためのアクチュエータを有すること。
2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

10

第１章

序論

本研究では 1.変形センサは自分たちで設計・開発、製作し、2.変形センサからのデータをリアルタイムに取得し熱アクチュエータを稼動させる。3.加熱板と冷却ファンを設置する。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

11

第１章

1.4

序論

本研究の目的

1. 変形センサの設計開発及びデータ取得のソフト作成。
2. 主軸回転時の変位を測定し、変位量によって熱アクチュエータを使用し変位量を軽減させる。
3. 上記の目標を達成するために、変形センサの仕組みを学習し、また、マシ
ニングセンタが熱変形を起こすメカニズムを解明する。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

12

第１章

1.5

序論

本論文の構成本論文は全 7 章から構成される。
第 1 章では研究の背景および目的について述べる。その中で、本研究で使用する高精密マシニングセンタの開発並びにその研究の根本的思想となっている「加工の知能化」の概念について説明し、本研究の主題となるマシニングセン
タの熱変形能動補償の意義と、そのために必要とされる機能について検討する。
第 2 章では、マシニングセンタによる高精密加工を実現するために変形センサの設計開発・製作、歪測定プログラムなどのハードウェアとソフトウェアの構成について述べる。
第 3 章では、高精密加工を実現するための姿勢制御の手段について述べる。
第 4 章では、高精密マシニングセンタの有する姿勢制御のためのハードウェ
アについて、性能評価を行う。
第 5 章では、熱アクチュエータによる姿勢制御実験を行う。
第 6 章では、総括的な考察と今後の展望を示す。
第 7 章では、本論文の結論を述べ本研究のまとめとする。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

13

第2章
高精密マシニングセンタの構成

14

第２章

2.1

高精密マシニングセンタの構成

システムの概略

本研究に用いた高精密加工システムの概略を図 2.1 に示す。

マシニングセンタ
熱アクチュエータ

主軸頭部+
コラム上部

ＰＭＣユニット

変形センサ

ＨＳＳＢ
ストレインアンプ
サーバー
クライアントＡ/Ｄボード熱アクチュエータ

主軸回転制御制御量決定

制御プロセス

プロセス

プロセス

計測・制御用コンピュータ

図 2.1

システムの概略

次節以降で、それぞれの機能について述べていく。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

15

第2章

2.2

高精密マシニングセンタの構成

マシニングセンタ

図 2.2、表 2.1 に本研究に用いた高精密マシニングセンタの外観及びその仕様
を示す。

図 2.2

高精密マシニングセンタ

このマシニングセンタは、大阪機工（株）製のＶＭ４−Ⅱのマシニングセン
タに加工の知能化を実現するために特殊な機構を装備したものである。
その機構とは以下のようなものである。
・

コラム下部に熱アクチュエータ（加熱、冷却用各１４箇所）を装備しており、熱変形に対してアクティブな補正が可能である
2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

16

第2章

・

高精密マシニングセンタの構成

マシニングセンタの各部に合計 5 本の変形センサが取り付けられており、マシニングセンタの変形状態や熱アクチュエータの作動状況をリアルタイ
ムに監視できる。

テーブル作業面ｍｍ

最大移動量
テーブル左右（Ｘ）
サドル前後 （Ｙ）
主軸頭上下 （Ｚ）

ｍｍ

主軸回転速度
早送り速度

ｒｐｍ
m/min

２５〜６０００
２４ （Ｘ，Ｙ）
１２ （Ｚ）

切削送り速度m/min

１〜１００００

ジョグ送り速度

m/min

２０００

表 2.1

・

・
・
・

８００×４００
６３０
４１０
４６０

ＯＫＫマシニングセンタＶＭ４−Ⅱの仕様

主軸モータ‐主軸頭部間、主軸頭部‐コラム上部、コラム上部‐コラム
下部間などに熱遮断体が設けられており、熱の伝播を極力小さくしている。
外部制御装置からマシニングセンタの各種機能が使用できる。
作業台にはＸ，Ｙ軸フェイルセイフテーブルが設けられており、過大な荷重が生じた時マシニングセンタ本体を守る。
オープンＣＮＣマシニングセンタなのでインターネットに繋がっており遠隔操作が可能。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

17

第2章

高精密マシニングセンタの構成

以上の機構を装備したマシニングセンタの構成の概略を図 2.3 に示す。

熱遮断帯
（室温）

主軸モータ
主軸頭部変形センサ

主軸頭
コラム
熱遮断帯

フェイルセイフテーブル
熱アクチュエータ

図 2.3

高精密マシニングセンタの構成の概略

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

18

第2章

2.3

高精密マシニングセンタの構成

変形検出機構（変形センサ）

2.3.1 システムの概略
図 2.4 に変形検出システムの概略を示す。

コラム上部
主軸頭部

デジタル量
歪値

ストレインアンプ

電圧値

Ａ/Ｄボード

変形センサ

変形量計算

補正制御および変位・変形量測定用プログラム

図 2.4

変形量検出システム

2.3.2 変形センサとは
3 次元形状測定機であるマシニングセンタでは、切削工具付近のスピンドルモータの発熱や切削液の噴霧冷却によって、構造体であるコラムがたわみ、工具
位置が変化する。このとき、その構造体の熱変形と工具位置との因果関係を知っていれば、熱変形を測定することで工具位置が測定できる。そこで、我々は変形センサをマシニングセンタに設置し熱変形を測定することにした。変形センサとは構造体の 2 点間に固定された 2 個の弾性ブロックと、その 2 個の弾性ブロックを結ぶ剛体連結棒とからなる。この 2 個のブロックは、片方または両方に平行平板構造を配していることが特徴であり、この構造によって図 2.5 の連結棒の軸方向（ｘ方向）のみに柔に弾性変形できる。構造体が変形すると、連結棒はｘ方向に剛であるから、図に示すようにブロックの平行平板だけが変形し、これを検出素子で測定する。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

19

第2章

高精密マシニングセンタの構成

変形センサの主要機能は、構造体の 2 点間の微小変形をセンサ内の平行平板の変形に集中させ、任意の方向の変形をそのほかの方向のそれと干渉させずに、力によって生じた変形と熱によって生じた変形とを分離して、その変形を各種の検出素子で検出することである。

検出素子
弾性ブロック
平行平板

機械の構造体
剛体連結棒
剛体ブロック

図 2.5

変形センサの変形検出の原理

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

20

第2章

高精密マシニングセンタの構成

2.3.3 変形センサの設計
今回の研究では変形センサの設計から自分たちで行うことにした。設計図を
図 2.6、2.7、2.8 に示す。また設計図をもとに ANSYS を使用して引っ張りと圧縮のシミュレーションを行った。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

21

第2章

高精密マシニングセンタの構成

④

②

①

ストレイン
アンプへ

歪ゲージ
Ｌ

Ｌ＝２１８mm (A)Ｌ＝４５８mm (B)
Ｌ＝５５８mm (C)Ｌ＝１０２３mm(D,E)

③

図 2.6

変形センサの構造

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

22

第2章

高精密マシニングセンタの構成

図 2.7

変形センサの設計図１

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

23

第2章

高精密マシニングセンタの構成

図 2.8

変形センサの設計図２

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

24

第2章

図 2.9

高精密マシニングセンタの構成

ANSYS による圧縮のシミュレーション

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

25

第2章

図 2.10高精密マシニングセンタの構成

ANSYS による引っ張りのシミュレーション

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

26

第2章

高精密マシニングセンタの構成

2.3.4 変形センサの製作
今回の変形センサの加工は平行平板部分をワイヤーカット、それ以外の部分をマシニングセンタを使用して製作した。

図 2.11

ワイヤーカット放電加工機

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

27

第2章

高精密マシニングセンタの構成

図 2.12 変形センサ

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

28

第2章

高精密マシニングセンタの構成

2.3.4.1 ストレインゲージ
今回使用したストレインゲージは（株）KYOWA の KFG-2-120-C1-23 である。
仕様は表 2.2 に示す。

TEMPERATURE COMPENSATIONALUMINUMGAGE LENGTH

2 mm

GAGE RESISTANCE(24℃,50%RH)
GAGE FACTOR(24℃,50%RH)

119.8 ±0.2 Ω
2.12 ±1.0 %ADOPTABLE THERMAL WXPANSION

23.4 PPM/℃

TRANSVERSE SENSITIVITY(24℃,50%RH)
APPLICABLE GAGE CEMENT

0.7 %CC-33A,PC-6

表 2.2

KYOWA KFG-2-120-C1-23 の仕様

ストレインゲージの張り方は曲げ歪の検出でき引っ張り、圧縮歪を消去でき
温度補償のある 2 アクティブゲージ法を採用する。

図 2.13 2 アクティブゲージ法の回路図

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

29

第2章

高精密マシニングセンタの構成

2.4 ストレインアンプ
図 2.12 に示すのは日本電気三栄（株）のストレインアンプである。今回使用
したＡＨ1108 は収納ケースに 8 プラグインのユニットが収納可能である。プラ
グインユニットにはＡＣストレインアンプを 5 台、熱電対アンプを 3 台装備した。

図 2.14 ストレインアンプ

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

30

第2章

高精密マシニングセンタの構成

適用ゲージ抵抗120Ω〜１ｋΩ

ブリッジ電源2Ｖ、0.5Vrms 内部切り替え
正弦波 25kHz

平衡調整方式
平衡調整範囲抵抗分自動バランス、バックアップ約１ヶ月、容量分自動除去
抵抗分±約 2％(±約 10000×10-6 ひずみ)

電圧感度200×10-6 ひずみ入力にて 5V 以上(VAR 最大)

測定範囲
非直線性

200、500、1k、2k、5k×10-6 ひずみ/FS、OFF(VAR 最大、BV=2V)±0.2%/FS 以内

周波数特性

DC〜10kHz±10%

表 2.3

仕様熱電対

ＡＣストレインアンプユニットＡＨ11−104

Ｔ形(CC)、Ｅ形(CRC)、J 形(IC)、K 形(CA)T 形 T1:−150〜150℃ T2:−200〜300℃
E 形 E1:−200400℃
E2:−200〜800℃
J 形 J1:−200〜400℃ J2:−200〜800℃
K 形 K1:−200〜600℃ K2:−200〜1200℃

測定温度範囲温度補償回路リニアライザ回路

誤差±2℃以内±0.5％/FS 以内(0℃以上) ±1.0％/FS 以内(0℃以上)

周波数特性DC~10kHz +1、−3dB
表 2.4

熱電対アンプユニットＡＨ11−109

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

31

第2章

2.5

高精密マシニングセンタの構成

Ａ／Ｄ変換ボード

ストレインアンプの出力はアナログ電圧値であるので、interface 社製 16 ビ
ット A／D 変換ボードＰＣＩ−3155 により、コンピュータに取り込む。仕様を
以下の表 2.5 に示す。

図 2.15 Ａ／Ｄ変換ボード

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

32

第2章

高精密マシニングセンタの構成

入力チャンネル数

シングルエンド入力 16 チャンネル / 差動入力 8 チャンネル

入力制御方式

マルチプレクサ方式

入力アクセス方式
変換時間

FIFO 方式
10 µs (チャンネル固定時)
10 µs/チャンネル (チャンネル切替時)

入力分解能

16bit

入力レンジ

バイポーラ: ±1V,±2.5V,±5V,±10V

バス仕様

PCI ローカルバス(Rev. 2.1 以上), 32 bit, 33
MHz

表 2.5

Ａ／Ｄ変換ボードＰＣＩ−3155 の仕様

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

33

第2章

2.6

高精密マシニングセンタの構成

熱アクチュエータ

本研究に用いるような 3 軸のマシニングセンタでは、構造体の変形による主軸位置の変位のうち並進方向の変位については座標系の原点をずらすことで 1μｍ刻みでの補正が可能であるが、主軸の傾きについてはＮＣ機能では補正できない。そこで、マシニングセンタのコラム下部に図 2.9 のように加熱板と冷却ファンをコラム前面、背面、側面、ATC 側面に設置する。

加熱板

冷却ファン
図 2.16 熱アクチュエータの設置図

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

34

第2章

高精密マシニングセンタの構成

ATC 反対側

側面熱アクチュエータ

背面熱アクチュエータ
前面熱アクチュエータ

ATC 側熱アクチュエータ

図 2.17

熱アクチュエータ配置図

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

35

第2章

高精密マシニングセンタの構成

熱アクチュエータは加熱板と冷却ファンがそれぞれ 14 個で構成されている。

図 2.18 熱アクチュエータ

これらの熱アクチュエータを加熱、冷却することで図 2.11 に示すような種々の変形モードで構造体を変形させることが可能である。この変形を必要なモードで変化させることで、熱変形による主軸の傾きの変化を打ち消すことができる。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

36

第2章

高精密マシニングセンタの構成

図 2.19 熱アクチュエータの変形モード

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

37

第2章

2.7

高精密マシニングセンタの構成

歪測定プログラム今回歪を測定するために、VisualC++を使用してデータ測定プログラムを作成した。操作画面を図 2.14 に示す。測定条件を変えられるようにし、データをメモ帳に保存できるようにした。
Ａ／Ｄ変換ボードから取得するデジタル値を歪に変えなければならない。
歪＝パネル表示校正値×デジタル値 / 分解能×1/2（2.1）
今回のゲージ法は 2 アクティブゲージなので、パネル表示校正値×1/2 で分解能が 65536 なので
歪＝1000×デジタル値 / 65536×1/2（2.2）という式が成り立つ。
また今回は変形センサの性能テストの際に熱伝対を使用して温度変化もはかるのでデジタル値から温度を求める。今回は−150℃〜150℃までを測定できるようにする。レンジは±5Ｖで、分解能が 65536 である。
温度＝30.0×デジタル値−32768 / 65536(2.3 )
この計算式をもとに変形センサ 5 本分、5 チャンネルの測定を行うことのできるプログラムを作成。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

38

第2章

2.8

高精密マシニングセンタの構成

遠隔制御プログラム

本研究で使用するマシニングセンタには外部パソコンとＣＮＣの間を光ファ
イバケーブルで結合したシステムでノイズの影響を受けない高速・広範囲のデータ転送が可能なＦＡＮＵＣ社の高速シリアルバス（ＨＳＳＢ：High Speed
Serial Bus）を搭載している。
このＨＳＳＢを通じて外部のパソコンから、以下のような制御を行うことができる。
・ 主軸回転数の設定（Ｓコード）
・ 主軸回転の制御及びクーラント、ワークライト等その他の装置の制御（Ｍコード）・ オートツールチェンジャの工具の選択（Ｔコード）
・ 軸送り量の設定
・ 原点シフト量の設定
・ 熱アクチュエータの制御（Ｈコード）
・ 自動運転のサイクルスタート、フィードホールド
遠隔制御の構成図を図 2.20 に遠隔操作の操作画面を図 2.21 に示す。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

39

第2章

高精密マシニングセンタの構成

マシニングセンタ

サーバー

ＨＳＳＢ

ＨＳＳＢボード

ネットワーク

変形センサ

クライアント
ストレイン

ＡＤボード

アンプ

図 2.20遠隔制御の構成図

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

40

第2章

高精密マシニングセンタの構成

図 2.21

遠隔操作画面

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

41

第2章

2.9

高精密マシニングセンタの構成

変形センサの設置

今回作成した変形センサ 5 本はすべて主軸ヘッド周辺に設置する。図 2.12 に示したセンサ A,B,C,D,E はそれぞれ図 2.22 に設置場所を示す。

SensorSensorC

B

SensorSensorSensor

図 2.22E

変形センサの設置図

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

A

D

42

第3章
姿勢制御の手法

43

第３章

3.1

姿勢制御の手段

基本変形モード

マシニングセンタの主軸位置は 3 軸方向の並進成分と、X 軸および Y 軸の回転成分に分割され計５次元の成分で記述できるものと考えられる。
構造体の変形による主軸変位を補正する手段としては、軸送りで対処する方法もあるが、これにより補正が可能なのは並進成分のみであり、回転成分は補正不可能である。並進成分に関しては、機械使用者が経験的に変位分を補正す
る、ないしは肉眼で確認するなどして補正できるが、回転成分に関しては、3 軸の送り機能しか持たない一般の工作機械ではどうにもならず、ドリルによる穴あけ加工やタッピング時の垂直度、フライス加工での加工面の平行度に悪影響を与える。
今回はこのうちの X 軸および Y 軸の回転成分に注目して研究を行っているが、この回転成分を熱アクチュエータで全て打ち消すことを考えた場合、かなり特殊な工夫をしなければならない。
そこで前章でも示したような熱アクチュエータ配置にするのだが、この配置
で回転成分を打ち消すことが可能であると図 2.17 に示す。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

44

第３章

3.2

姿勢制御の手段マシニングセンタ姿勢制御法

今回変形センサからの取得する歪のデータを利用してマシニングセンタの姿
勢制御をすることにする。2 ゲージアクティブ法では曲げのひずみを検出することができるのでマシニングセンタの主軸回転中の熱変形を取得する。そしてコラムに取り付けられた熱アクチュエータを稼動させそのときの熱変形を取得する。これらのデータによりどの部分がどれだけ変形するかがわかる。このデー
タをもとに加工中の熱変形を遠隔操作で熱アクチュエータを動かすことにより、できるだけ熱変形を 0 に持っていくような変形モードの組み合わせの遠隔プログラムを作成する。姿勢制御の流れを図 3.1 に示す。

マシニングセンタ
熱アクチュエータ
熱変形補正
ＨＳＳＢ

サーバー
ＨＳＳＢボード

コラム上部・主軸頭部
ネットワーク

変形センサ

クライアント制御・歪計測用プログラム
ストレインア
ンプ

図 3.1

ＡＤボード

マシニングセンタの熱変形能動補償システム

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

45

第4章
変形センサの性能評価

第４章

変形センサの性能評価

46

4.1

ハードウェアの性能評価

本章では、高精密マシニングセンタに設置した熱アクチュエータ、変形セン
サ等の姿勢制御のためのハードウェアについて、その性能を評価し、高精密マ
シニングセンタの能力を確認する。

4.2

変形センサの性能評価

本研究では変形センサを自分たちで設計・開発、製作したので性能評価実験を何回も繰り返して正確なデータの測定できる変形センサのみをマシニングセ
ンタに設置しなければならない。今回性能評価実験として、SS400 の 10×1300
×100 にシリコンラバーヒーターを取り付け、変形センサを設置し、30 分加熱
30 分冷却し温度変化と歪を測定する。

幅×長さ

100×100

容量60W

連続使用温度
最高使用温度

200℃
250℃

リード線の長さ

300ｍｍ

表 4.1

シリコンラバーヒーターの仕様

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

47

図 4.1

変形センサ性能評価実験

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

48

L

引っ張り
L+α(加熱)図 4.2

変形センサ性能評価実験外略図

このように加熱板で鉄板の中央のみを加熱するのでその部分が膨張し変形センサに引っ張りの力がかかり、変形センサの性能がよければマイナスの値が出るはずである。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

4930分加熱30分冷却の温度変化量25

Temperature[℃]

20
15
10

温度変化量

5
0
-5

0

10

20

30

40

50

Time[min]

図 4.3

性能評価実験の温度変化

SensorA 性能評価実験
100

Strain[μst]

-10 0

10

20

30

40

50

-20
-30

SensorA

-40
-50
-60
-70
-80
Time[min]

図 4.4

センサ A の性能評価実験

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

50

SensorB 性能評価実験

Starain[μst]

20
0
-20 0
-40

10

20

30

40

50

-60
-80
-100

SensorB-120-140
Time[min]

図 4.5

センサ B の性能評価実験

SensorC 性能評価実験
200Starin[μst]

-20 0

10

20

30

40

50

-40
-60

SensorC

-80
-100
-120
-140
-160
Time[min]

図 4.6

センサ C の性能評価実験

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

SensorD 性能評価実験
0
0
-20

10

20

30

40

50

51

図 4.7

センサ D の性能評価実験
SensorE性能評価実験

20

Strain[μst]

0
-20

0

10

20

30

40

50

-40

SensorE

-60
-80
-100
Time[min]

図 4.8

センサ E の性能評価実験

以上の結果より変形センサ 5 本は実験に必要な性能を十分持ち合わせているといえる。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

52

4.3

熱アクチュエータの性能評価

マシニングセンタのコラム部下部に設置されてある熱アクチュエータについて、30 分加熱し、30 分冷却して熱アクチュエータの各部の性能評価をする。今回熱アクチュエータ部分には変形センサを設置してなしが、熱アクチュエータの加熱冷却で主軸部がどれだけ変形するかも同時に見てみる。

ATC側30分加熱30分冷却
108Strain[μst]

6
4
2
0
-2 0

10

20

30

40

50

SensorB
SensorA
SensorC
SensorD
SensorE-4-6-8Time[min]

図 4.9

ATC 側熱アクチュエータ性能評価実験

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

53

Strain[μst]背面30分加熱30分冷却
16
14
12
10
8
6
4
2
0
-2 0
-4

SensorB
SensorA
SensorC
SensorD
SensorE
10

20

30

40

50

Time[min]

図 4.10

コラム背面熱アクチュエータ性能評価実験

側面30分加熱30分冷却20Starain[μst]

15
10
5
0
-5

0

10

20

30

40

50

SensorB
SensorA
SensorC
SensorD
SensorE-10
Time[min]

図 4.11

コラム側面熱アクチュエータ性能評価実験

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

54

前面30分加熱30分冷却
108Strain[μst]

6
4
2
0
-2 0

10

20

30

40

50

SensorB
SensorA
SensorC
SensorD
SensorE-4-6Time[min]

図 4.12

コラム前面熱アクチュエータ性能評価実験

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」
第４章

変形センサの性能評価

55

4.4

結果及び考察本研究では変形センサを自分たちで設計開発、製作したので歪がうまく測定できるか不安だったがうまく測定することができた。しかし、若干ノイズが気になるが今回の研究には支障がないレベルである。
しかし、変形センサの性能評価実験の時よりも出力値にばらつきが見られるのは変形センサの取り付け方に問題があると考えられる。変形センサを取り付けるときには、センサに過大な負荷がかかることのないように取り付けたのだ
が、結果を見る限りでは、最も出力が出るセンサと出ないセンサとの間に倍程度の差があり、均等化できてないようである。もちろん変形センサ自体にも個体差がある。このように取り付け方法、さらには取り扱い、メンテナンスが難しいセンサがシステムに組み込まれている場合には、このような機械が世の中に広がる可能性は非常に低いといわざる得ない。
熱アクチュエータ部分には変形センサを取り付けてないが、主軸部分の変形センサでもきちんと熱アクチュエータの 30 分加熱 30 分冷却を取得することができ、熱アクチュエータの加熱板と冷却ファンは十分な性能を持っているといえる。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

56

第5章
熱アクチュエータによる姿勢制御

57

第５章

5.1

熱アクチュエータによる姿勢制御

主軸回転時の熱変形測定

熱アクチュエータによる姿勢制御をするために主軸回転時の歪測定を行い、測定データから変形モードを導き出す。今回は加工時によく使用する回転数
1500rpm と 3000rpm、またマシニングセンタの最高回転数である 6000rpm で歪測定を行った。

2時間主軸回転1500ｒｐｍ
10Strain[μst]

5
0
0

20

40

60

80

100

-5

SensorB
SensorA
SensorC
SensorD
SensorE-10-15Time[min]

図 5.1

2 時間主軸回転 1500rpm での歪測定

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

58

第５章

熱アクチュエータによる姿勢制御

2時間主軸回転3000ｒｐｍ
50Strain[μst]

-5 0

20

40

60

80

100

-10
-15
-20
-25

SensorB
SensorA
SensorC
SensorD
SensorE-30-35Time[min]

図 5.2

2 時間主軸回転 3000rpm での歪測定

2時間主軸回転6000ｒｐｍ
20

Strain[μst]

0
-20

0

20

40

60

80

100

-40
-60
-80

SensorB
SensorA
SensorC
SensorD
SensorE-100-120
Time[min]

図 5.3

2 時間主軸回転 6000rpm での歪測定

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

59

第５章

熱アクチュエータによる姿勢制御

主軸回転による熱変形ではセンサ A、B、D ではそれほど大きな熱変形はなかったが、センサ C、E が大きく変形した。この変形センサは圧縮が＋引張りが−となっており、図 2.19 からわかるようにマシニングセンタの左側に大きな熱変形が生じている。これはマシニングセンタ右側に電源などがあり主軸回転時に熱を持ちやすいと考えられる。また機械自体の冷却装置によってあまり加熱してない左側が冷却されることによって圧縮され、そのために左側のセンサ C、E が大きく変形したのではないだろうか。最大回転数の 6000 回転だとセンサ A、B、D も若干変形を生じた。しかし実際の加工で 6000 回転を使用することがな
く、これからの制御には実際に使用する最大回転数 3000 回転を基準に制御していく。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

60

第５章

5.2

熱アクチュエータによる姿勢制御

熱アクチュエータでの熱変形測定

今回の研究では熱アクチュエータを使用して熱変形を制御するので、熱アクチュエータでどれぐらいの変形が起こるかを把握しなくてはならない。そこで、4 章でおこなった熱アクチュエータの性能評価実験と同じように、前面、背面、側面、ATC 側の各熱アクチュエータを 30 分加熱 30 分冷却し、それを数回繰り返しその平均をグラフ化し、熱アクチュエータが各センサにどれだけ変形を与えているかを実験する。

ATC側30分加熱30分冷却の平均

Strain[μｓ
ｔ
]

8
6
4
2
0
-2 0
-4

10

20

30

40

50

SensorB
SensorA
SensorC
SensorD
SensorE-6-8Time[min]

図 5.4

ATC 側 30 分加熱 30 分冷却の平均

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

61

第５章

熱アクチュエータによる姿勢制御

前面30分加熱30分冷却の平均
8Strain[μst]

6
4
2
0
0

-2

10

20

30

40

50

SensorB
SensorA
SensorC
SensorD
SensorE-4
Time[min]

図 5.5

前面 30 分加熱 30 分冷却の平均

側面30分加熱30分冷却の平均
15Strain[μst]

10
5
0
0

10

20

30

40

50

-5

SensorB
SensorA
SensorC
SensorD
SensorE-10
Time[min]

図 5.6

側面 30 分加熱 30 分冷却の平均

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

62

第５章

熱アクチュエータによる姿勢制御

背面30分加熱30分冷却の平均
12Strain[μst]10
SensorB
SensorA
SensorC
SensorD
SensorE

8
6
4
2
0
-2 0

10

20

30

40

50

Time[min]

図 5.6

背面 30 分加熱 30 分冷却の平均の近似曲線

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

63

第５章

熱アクチュエータによる姿勢制御

以上の結果から熱アクチュエータと歪の関係は表 5.1 のようになる

前面

加熱

冷却

背面

加熱

冷却

Sensor A?

?

SensorA

?

?

B
C

?
?

?
?

B
C

?
?

?
?

D

?

?

D

−

−

E

?

?

E

?

−

ATC

加熱

冷却

側面

加熱

冷却

Sensor A−?

SensorA

?

?

B
C

?
−

?
?

B
C

−
−

−
−

D

−

?

D

−

−

E

−

?

E

−

−

表 5.1

熱アクチュエータと歪の関係

これの結果から主軸 3000 回転の時の熱変形を熱アクチュエータを使用して軽減させるように実験をしていき、最良の熱アクチュエータの組み合わせを見つけそれを利用して制御していく。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

64

第５章

5.3

熱アクチュエータによる姿勢制御

姿勢制御プログラムによる熱変形補償実験

実際に主軸を回転させた時に熱アクチュエータを稼動させ、マシニングセン
タの熱変形を軽減させる実験を行う。今回は実際に加工時に使用する最大回転数 3000rpm で遠隔制御プログラムの元で実験を行う。この遠隔制御プログラムには常に歪±0.02 以下に抑えるように熱アクチュエータを遠隔で操作するようにプログラムを組んである。センサ C、E に影響の大きい前面と背面の熱アク
チュエータを使用し、実験を行う。

2時間主軸3000rpm前面加熱背面冷却
50Strain[μst]

-5 0

20

40

60

80

100
SensorB
SensorA
SensorC
SensorD
SensorE

-10
-15
-20
-25
-30
-35
-40
Time[min]

図 5.7

前面加熱背面冷却2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

65

第５章

熱アクチュエータによる姿勢制御

2時間主軸3000rpm前面背面冷却30

Strain[μst]

20
10
0
-10

0

10

20

30

40

50

-20

SensorB
SensorA
SensorC
SensorD
SensorE-30-40Time[min]

図 5.8

前面背面冷却

2時間主軸3000rpm前面背面加熱
105Strain[μst]

0
-5 0

20

40

60

80

-10
-15
-20

100

SensorB
SensorA
SensorC
SensorD
SensorE-25-30
Time[min]

図 5.9

前面背面加熱2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

66

第５章

熱アクチュエータによる姿勢制御

2時間主軸3000rpm前面冷却背面加熱
20

Strain[μst]

10
0
-10

0

20

40

60

80

100

-20

SensorB
SensorA
SensorC
SensorD
SensorE-30-40Time[min]

図 5.10 前面冷却背面加熱

今回の実験主軸 2 時間 3000rpm で熱変形を減少できたのは熱アクチュエータ
前面背面加熱、前面背面冷却のみであった。しかし、減少したとはいえその減
少幅は 10μst だけだった。前面背面の熱アクチュエータ以外の組み合わせ行っても若干の軽減もしくは変化なしであった。主軸回転時の歪はセンサ C、E す
なわち熱アクチュエータ前面部が後ろに仰け反るような形となり引っ張られ、
マイナスの歪が出たので、その前面を冷却し反対の背面を加熱することによって歪が軽減されると考えたが制御に至るまでの結果が出なかった。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

67

第５章

5.4

熱アクチュエータによる姿勢制御

結果、及び考察熱アクチュエータによる姿勢制御は、センサ A、B、C、D、E において制御することができなかった。主軸回転時の熱変形に伴う歪の値が思っていたより
大きく、今回使用した熱アクチュエータの数では制御することができなかった。
しかし若干であるが軽減させることはできたのは事実である。
主軸頭部に設置した変形センサが主軸回転時に大きく変形することはだいた
い想像はできたことだが、コラム下部に設置した熱アクチュエータによる影響があまり主軸部分に影響がないこと分かり、今回の熱アクチュエータによる熱変形の制御は失敗に終わった。
加工前に熱アクチュエータを稼動しておいてから主軸回転すればもう少し歪は軽減されると思うが、それでは加工時間の短縮ということにならないのでも少し熱アクチュエータの数と設置場所を考える必要がある。
しかし、変形を 0 にすることで主軸の傾きが０になるかどうかはわからなく、疑問が多少残るがこれは今後の課題として、後輩たちに任せることにする。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

68

第6章
総括と展望

69

第６章

6.1

総括と展望

姿勢制御のためにハードウェアとして有している性能

・変形センサは、測定対象の熱変形を正確にとらえることができていることがわかった。
・高精密マシニングセンタは熱変形が正確に把握できた時、ハードウェアとしては熱変形を制御することができる可能性があるということが確かめられた。
以上のように、高精密マシニングセンタは加工の知能化の概念を実現し、ハードウェアとしては非常に高い性能を持っていることが明らかとなった。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

70

第６章

6.2

総括と展望

展望

今回は熱アクチュエータがマシニングセンタにどのような熱変形をもたらす
かということがわからず、最初からデータを測定しなければならなかった。また実際に遠隔で制御する際も、熱変形が起こってから熱アクチュエータを稼動させるというような仕組みであったから精度の要求されるモノの加工には不向
きな制御方法である。また今回は主軸回転のみの研究で実際の加工中の歪測定は行っていない。
今回のデータをもとに熱変形を予測するシステムを作り、熱変形を 0 に持っていくような遠隔制御システムが必要である。
具体的には、有限要素法による構造シミュレーションにより、幾何学的な関係を明らかにすることや、それに、熱流束や熱変形を加味したモデルなどが考えられる。これは今後、ぜひ検討すべきである。
結果として制御するまで至らなかった今回の研究は成功とはいえないが、新たな問題点がいくつか見えてきた。まず変形センサの数である。今回の研究では 5 本という数だったが、これではマシニングセンタ全体の変形を把握することは難しい。また熱アクチュエータもコラム下部のみにしか搭載していない。
今後この研究を引き継いでもらう後輩にはぜひこういった問題点を解決し、熱変形を制御することのできる高精密マシニングセンタを開発してもらいたい。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

71

第7章
結論

72

第７章

7.1

結論

結論

・変形センサの検出部の板厚は１ mm で十分な歪を検出できることができた。
・遠隔操作プログラムに歪測定プログラムを組み込むことによって遠隔姿勢制
御プログラムを作ることができた。
・主軸回転時のマシニングセンタの熱変形による歪を測定することにより、加工中にどのような曲げが生じているかが明らかになった。
・熱変形能動補償型高精密マシニングセンタは、主軸回転数 3000rpm までの熱変形による歪を若干であるが軽減することができた。しかし制御するところまでには至らなかった。
・更なる精度向上には主軸の変位測定とその変位予測機能と、熱変形予測機能を検討する必要がある。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

73

謝辞

謝辞
本研究を進めるにあたり、多くの方々にご指導、ご協力をいただきました。
本論文を締めくくるにあたり、高精密マシニングセンタの開発、研究に携わってこられた多くの方々に感謝の意を表します。
指導教官である長尾教授には日頃から親身なご指導をいただきました。おかげで大学院の 2 年間を大変有意義なものにすることができました。
同じ研究室の木崎君、上條君にも遠隔プログラム作成時や、変形センサ製作
時にいろいろなアドバイスをしてもらい大変助かりました。
小林研究室の橋本君、小山君には変形センサ作成時のワイヤーカットでの加工の時には大変お世話になりました。
最後に今回の研究を一緒に行った学部 4 年の浅田君、高谷君には最初から最後まで実験を手伝ってもらい大変感謝しています。
本当にありがとうございました。

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

74

参考文献

参考文献
[1]田口将、 変形情報に基づく姿勢制御によるマシニングセンタの高精密化の究 、1991 年度東京大学大学院工学系研究科産業機械工学専攻修士論文[2]奥村努、 変形情報に基づく姿勢制御によるマシニングセンタの高精密化の究 、1994 年度東京大学大学院工学系研究科産業機械工学専攻修士論文[3]花山良平、 熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究 、1998 年東京大学工学部産業機械工学科卒業論文[4]長尾高明、畑村洋太郎、衛光石衛、中尾政之、 知能化生産システム 、朝倉書店、2000 年[5]加藤賢一、 マシニングセンタの知能化による高精密化の試み 、1991 年度東京大学大学院工学系研究科産業機械工学専攻修士論文[6]市川純理、 ニューラルネットワークを用いたマシニングセンタ高精密化の試
み 、1992 年東京大学工学部産業機械工学科卒業論文[7]堤和久、 熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究 、1996 年東京大学工学部産業機械工学科卒業論文[8]佐藤善治、 マシニングセンタ加工 、日刊工業新聞社、1996 年

2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

75

付録

付録
1.データ集（a）熱アクチュエータの 30 分加熱 30 分冷却実験データ

ATC側30分加熱30分冷却

5
0
-5 0

10 20 30 40 50-10

SensorB
SensorA
SensorC
SensorD
SensorE

10
Strain[μst]Starain[μst]10

ATC側30分加熱30分冷却

5
0
-5 0
-10

Time[min]Time[min]

ATC側30分加熱30分冷却

5
0
-5 0

10 20 30 40 50-10

前面30分加熱30分冷却

SensorB
SensorA
SensorC
SensorD
SensorE

10
Strain[μst]Strain[μst]

10

5
0
0

0

10 20

30

40 50

-5
Time[min]側面30分加熱30分冷却

SensorB
SensorA
SensorC
SensorD
SensorE

15
Strain[μst]Strain[μst]0

SensorB
SensorA
SensorC
SensorD
SensorE

Time[min]前面30分加熱30分冷却5

10 20 30 40 50-5Time[min]10

10 20 30 40 50

SensorB
SensorA
SensorC
SensorD
SensorE

10
5
0
-5 0

10 20 30 40 50-10Time[min]2002 年度修士論文「熱変形能動補償型高精密マシニングセンタによる加工精度向上の研究」

SensorB
SensorA
SensorC
SensorD
SensorE

76

付録

2.実験プログラム
歪測定プログラム// 改良変形センサ Dlg.cpp : インプリメンテーション フ//{{AFX_DATA(CAboutDlg)

ァイルenum { IDD = IDD_ABOUTBOX };////}}AFX_DATA#include "stdafx.h"// ClassWizard は仮想関数のオーバーライ#include "改良変形センサ.h"

ドを生成します#include "改良変形センサ Dlg.h"//{{AFX_VIRTUAL(CAboutDlg)#include"FbiAd.h"

protected:#ifdef _DEBUG

virtualvoid#define new DEBUG_NEW

DoDataExchange(CDataExchange*#undef THIS_FILE

DDX/DDV のサポート

static char THIS_FILE[] = __FILE__;

pDX);

//

//}}AFX_VIRTUAL

HANDLE hDeviceHandle;
WORD wSmpData[30000][5];// インプリメンテーション

int SamplingNum;

protected:

int i;//{{AFX_MSG(CAboutDlg)

ULONG ulSmplNum;//}}AFX_MSGADSMPLREQ SmplConfig;

DECLARE_MESSAGE_MAP()

int

};

ch1,ch2,ch3,ch4,ch5,x1,x2,ynew1,ynew2,ynew3,ynew4,
ynew5,yold1,yold2,yold3,yold4,yold5,xa,SaveData;

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

int{

Grafu;

CString A,B,C;//{{AFX_DATA_INIT(CAboutDlg)

char dummy[256];//}}AFX_DATA_INIT

FILE *fp;}

int SamplingPeriod=0;
int SamplingFreq=0;

void#endifpDX)

CAboutDlg::DoDataExchange(CDataExchange*{/////////////////////////////////////////////////////////////////////////////

CDialog::DoDataExchange(pDX);// アプリケーションのバージョン情報で使われている//{{AFX_DATA_MAP(CAboutDlg)

CAboutDlg ダイアログ//}}AFX_DATA_MAP}

class CAboutDlg : public CDialog{

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

public://{{AFX_MSG_MAP(CAboutDlg)
CAboutDlg();// メッセージ ハンドラがありません。

// ダイアログ データ//}}AFX_MSG_MAP

77

END_MESSAGE_MAP()

DDX_Control(pDX, IDC_PICT2, m_2ch);
DDX_Control(pDX, IDC_PICT1, m_1ch);/////////////////////////////////////////////////////////////////////////////

DDX_Control(pDX,// CMyDlg ダイアログ

IDC_SAMPLING,

m_sampling);
DDX_Control(pDX,

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)

IDC_SMPNUM,

m_smpnum);: CDialog(CMyDlg::IDD, pParent)

DDX_Control(pDX,{

IDC_SMPFREQ,

m_smpfreq);//{{AFX_DATA_INIT(CMyDlg)

DDX_Control(pDX, IDC_STOP, m_stop);m_message = _T("");

DDX_Control(pDX, IDC_START, m_start);

m_e1ch = _T("");

DDX_Control(pDX, IDC_SET, m_set);m_e2ch = _T("");

DDX_Control(pDX,

m_e3ch = _T("");

IDC_ADCLOSE,

m_adclose);

m_e4ch = _T("");

DDX_Control(pDX,

m_e5ch = _T("");

IDC_ADOPEN,

m_adopen);m_ch1 = FALSE;

DDX_Text(pDX,

m_ch10 = FALSE;

IDC_EDIT_MESSAGE,

m_message);m_ch11 = FALSE;

DDX_Text(pDX, IDC_CH1, m_e1ch);m_ch12 = FALSE;

DDX_Text(pDX, IDC_CH2, m_e2ch);

m_ch13 = FALSE;

DDX_Text(pDX, IDC_CH3, m_e3ch);m_ch14 = FALSE;

DDX_Text(pDX, IDC_CH4, m_e4ch);

m_ch2 = FALSE;

DDX_Text(pDX, IDC_CH5, m_e5ch);m_ch3 = FALSE;DDX_Check(pDX, IDC_CHECK1, m_ch1);

m_ch4 = FALSE;DDX_Check(pDX,

IDC_CHECK10,

DDX_Check(pDX,

IDC_CHECK11,

DDX_Check(pDX,

IDC_CHECK12,

DDX_Check(pDX,

IDC_CHECK13,

DDX_Check(pDX,

IDC_CHECK14,

m_ch5 = FALSE;

m_ch10);m_ch6 = FALSE;
m_ch7 = FALSE;

m_ch11);m_ch8 = FALSE;
m_ch9 = FALSE;

m_ch12);//}}AFX_DATA_INIT
//

メ モ :

LoadIcon

は

Win32

の

m_ch13);

DestroyIcon のサブシーケンスを要求しません。
m_hIcon=m_ch14);AfxGetApp()->LoadIcon(IDR_MAINFRAME);

DDX_Check(pDX, IDC_CHECK2, m_ch2);}

DDX_Check(pDX, IDC_CHECK3, m_ch3);
DDX_Check(pDX, IDC_CHECK4, m_ch4);

void

CMyDlg::DoDataExchange(CDataExchange*

DDX_Check(pDX, IDC_CHECK5, m_ch5);

pDX)

DDX_Check(pDX, IDC_CHECK6, m_ch6);{

DDX_Check(pDX, IDC_CHECK7, m_ch7);
CDialog::DoDataExchange(pDX);DDX_Check(pDX, IDC_CHECK8, m_ch8);//{{AFX_DATA_MAP(CMyDlg)

DDX_Check(pDX, IDC_CHECK9, m_ch9);

DDX_Control(pDX, IDC_PICT, m_pict);//}}AFX_DATA_MAP

DDX_Control(pDX, IDC_PICT5, m_5ch);}

DDX_Control(pDX, IDC_PICT4, m_4ch);
DDX_Control(pDX, IDC_PICT3, m_3ch);

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

78//{{AFX_MSG_MAP(CMyDlg)

OnCheck14)

ON_WM_SYSCOMMAND()
ON_WM_PAINT()//}}AFX_MSG_MAP
END_MESSAGE_MAP()

ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ADOPEN,
OnAdopen)/////////////////////////////////////////////////////////////////////////////// CMyDlg メッセージ ハンドラ

ON_BN_CLICKED(IDC_ADCLOSE,
OnAdclose)
ON_BN_CLICKED(IDC_START, OnStart)

BOOL CMyDlg::OnInitDialog(){

ON_BN_CLICKED(IDC_SET, OnSet)

CDialog::OnInitDialog();

ON_BN_CLICKED(IDC_RADIO1,
OnRadio1)// "バージョン情報..." メニュー項目をシステ
ON_BN_CLICKED(IDC_RADIO2,

ム メニューへ追加します。

OnRadio2)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_STOP, OnStop)// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。

ON_BN_CLICKED(IDC_SERVERCON,
OnServercon)

ASSERT((IDM_ABOUTBOX & 0xFFF0)== IDM_ABOUTBOX);

ON_BN_CLICKED(IDC_CHECK1,ASSERT(IDM_ABOUTBOX < 0xF000);

OnCheck1)
ON_BN_CLICKED(IDC_CHECK2,
OnCheck2)

CMenu*

pSysMenu=

GetSystemMenu(FALSE);

ON_BN_CLICKED(IDC_CHECK3,

if (pSysMenu != NULL)

OnCheck3){

ON_BN_CLICKED(IDC_CHECK4,

CString strAboutMenu;

OnCheck4)
ON_BN_CLICKED(IDC_CHECK5,
OnCheck5)

strAboutMenu.LoadString(IDS_ABOUTB
OX);

ON_BN_CLICKED(IDC_CHECK6,

if (!strAboutMenu.IsEmpty())

OnCheck6){

ON_BN_CLICKED(IDC_CHECK7,
OnCheck7)
ON_BN_CLICKED(IDC_CHECK8,pSysMenu->AppendMenu(MF_SEPARATOR);

OnCheck8)
ON_BN_CLICKED(IDC_CHECK9,
OnCheck9)

pSysMenu->AppendMenu(MF_STRING,
IDM_ABOUTBOX, strAboutMenu);

ON_BN_CLICKED(IDC_CHECK10,
OnCheck10)}}

ON_BN_CLICKED(IDC_CHECK11,
OnCheck11)
ON_BN_CLICKED(IDC_CHECK12,
OnCheck12)
ON_BN_CLICKED(IDC_CHECK13,
OnCheck13)
ON_BN_CLICKED(IDC_CHECK14,// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m_hIcon, TRUE);// 大きいアイコンを設定

79

SetIcon(m_hIcon, FALSE);// 小さいアイコンを設定

SendMessage(WM_ICONERASEBKGND,(WPARAM) dc.GetSafeHdc(), 0);// TODO: 特別な初期化を行う時はこの場所に追加してください。

// クライアントの矩形領域内の中央

m_adclose.EnableWindow(FALSE);
m_adopen.EnableWindow(TRUE) ;int=

cyIcon=

GetSystemMetrics(SM_CXICON);m_start.EnableWindow(FALSE);
m_stop.EnableWindow(FALSE);

cxIconint
GetSystemMetrics(SM_CYICON);
CRect rect;

GetClientRect(&rect);return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。

int x = (rect.Width() - cxIcon +1) / 2;}

int y = (rect.Height() - cyIcon +1) / 2;

void CMyDlg::OnSysCommand(UINT nID, LPARAM
lParam)// アイコンを描画します。

{

dc.DrawIcon(x, y, m_hIcon);if ((nID & 0xFFF0) == IDM_ABOUTBOX)

}

{

else
CAboutDlg dlgAbout;{

dlgAbout.DoModal();CDialog::OnPaint();

}

}

else

}

{
CDialog::OnSysCommand(nID,lParam);// システムは、ユーザーが最小化ウィンドウをドラッグしている間、}// カーソルを表示するためにここを呼び出します。

}

HCURSOR CMyDlg::OnQueryDragIcon(){// もしダイアログボックスに最小化ボタンを追加するな
らば、アイコンを描画する

return (HCURSOR) m_hIcon;}// コードを以下に記述する必要があります。MFC アプ
リケーションは document/view

void CMyDlg::OnAdopen()// モデルを使っているので、この処理はフレームワーク{

により自動的に処理されます。

// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

void CMyDlg::OnPaint()

m_adclose.EnableWindow(TRUE);{

m_adopen.EnableWindow(FALSE);
if (IsIconic()){

m_message="AD ボードオープンしました";
hDeviceHandle = AdOpen("FBIAD1");

CPaintDC dc(this); // 描画用のデバイス コンテキスト

if(hDeviceHandle==

INVALID_HANDLE_VALUE){
MessageBox("Deviceは使用できません");

FBIAD180

exit(0);m_message="サンプリング開始します";}m_start.EnableWindow(FALSE);

AdGetSamplingConfig(hDeviceHandle,&Sm_stop.EnableWindow(TRUE);

mplConfig);m_smpfreq.GetWindowText(B);

SmplConfig.ulSmplNum = SamplingNum;

SamplingFreq=atoi(B);

SmplConfig.ulChCount =5;
SmplConfig.ulSamplingModem_smpnum.GetWindowText(C);=SamplingNum=atoi(C);=

SetTimer(1,45,NULL);

AD_IO_SAMPLING;
SmplConfig.ulSingleDiff

if(Grafu==1){

AD_INPUT_SINGLE;
SmplConfig.fSmplFreq= SamplingFreq;//1CH の色

SmplConfig.SmplChReq[0].ulChNo = 1;

CBrush newBrush;

SmplConfig.SmplChReq[0].ulRange = AD_5V;

CDC* pDC=m_1ch.GetDC();

SmplConfig.SmplChReq[1].ulChNo = 2;

newBrush.CreateSolidBrush(RGB(255,0,0));

SmplConfig.SmplChReq[1].ulRange = AD_5V;

pDC ->SelectObject(&newBrush);

SmplConfig.SmplChReq[2].ulChNo = 3;

pDC ->Rectangle(0,0,10,10);

SmplConfig.SmplChReq[2].ulRange = AD_5V;//2CH の色

SmplConfig.SmplChReq[3].ulChNo = 4;
SmplConfig.SmplChReq[3].ulRange = AD_5V;
SmplConfig.SmplChReq[4].ulChNo = 5;
SmplConfig.SmplChReq[4].ulRange = AD_5V;

CDC* pDC2=m_2ch.GetDC();
CBrush newBrush2;
newBrush2.CreateSolidBrush(RGB(0,0,255));
pDC2->SelectObject(&newBrush2);
pDC2->Rectangle(0,0,10,10);

AdSetSamplingConfig(hDeviceHandle,&S
mplConfig);//3CH の色
CDC* pDC3=m_3ch.GetDC();

UpdateData(false);}

CBrush newBrush3;
newBrush3.CreateSolidBrush(RGB(0,255,0));pDC3->SelectObject(&newBrush3);

void CMyDlg::OnAdclose(){

pDC3->Rectangle(0,0,10,10);//4CH の色

m_message="AD ボード閉じました";

CDC* pDC4=m_4ch.GetDC();m_adclose.EnableWindow(FALSE);

CBrush newBrush4;

m_adopen.EnableWindow(TRUE);

newBrush4.CreateSolidBrush(RGB(0,255,255));

m_start.EnableWindow(FALSE);

pDC4->SelectObject(&newBrush4);

m_stop.EnableWindow(FALSE);

pDC4->Rectangle(0,0,10,10);m_set.EnableWindow(TRUE);//5CH の色// TODO: この位置にコントロール通知ハン

CDC* pDC5=m_5ch.GetDC();

ドラ用のコードを追加してください

CBrush newBrush5;

AdClose(hDeviceHandle);

newBrush5.CreateSolidBrush(RGB(255,0,255));

UpdateData(false);

pDC5->SelectObject(&newBrush5);}

pDC5->Rectangle(0,0,10,10);//座標軸

void CMyDlg::OnStart()

CDC*pDC6=m_pict.GetDC();{

pDC6->MoveTo(0,200);// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください

pDC6->LineTo(410,200);
pDC6->MoveTo(10,0);

81

pDC6->LineTo(10,310);

m_smpnum.SetWindowText(dsp);}}

if(SaveData==1){
AdStartSampling(hDeviceHandle,

void CMyDlg::OnRadio1()

FLAG_SYNC);{

ulSmplNum=SamplingNum;// TODO: この位置にコントロール通知ハン

AdGetSamplingData(hDeviceHandle,

ドラ用のコードを追加してください&wSmpData[0][0], &ulSmplNum);m_sampling.EnableWindow(TRUE);

fp = fopen("SampleData.txt","w+");m_smpnum.EnableWindow(TRUE);

if(fp==NULL){

SaveData=1;

fprintf(stderr,"¥n¥tCannotOpen SampleData.txt¥n¥t");

Grafu=0;}}for (i=0; i<SamplingNum; i++)void CMyDlg::OnRadio2(){

fprintf(fp,"%.2f
%f

%f

%f

%f

%f

// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください¥n",i*1/SmplConfig.fSmplFreq,30.0*(wSmpData[i][0]-m_sampling.EnableWindow(FALSE);

32768.0)/6553.6/*(10.0*wSmpData[i][0]/65536-5.0)*0.9

m_smpnum.EnableWindow(FALSE);*/,

SaveData=0;(10.0*wSmpData[i][1]/65536-5.0)*0.9,(10.0

Grafu=1;*wSmpData[i][2]/65536-5.0)*0.9,(10.0*wSmpData[i][3]/65536-5.0)*0.9,(10.0*wSmpData[i][4]/65536-5.0)*0.9)};
fclose(fp);m_message="サンプリング完了しました";
AdStopSampling(hDeviceHandle);}

void CMyDlg::OnTimer(UINT nIDEvent){// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼びUpdateData(false);}

出してくださいAdStartSampling(hDeviceHandle,
FLAG_ASYNC);

void CMyDlg::OnSet()

ulSmplNum=1000;{

AdGetSamplingData(hDeviceHandle,// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください
m_start.EnableWindow(TRUE);
m_sampling.GetWindowText(A);SamplingPeriod=atoi(A);m_smpfreq.GetWindowText(B);SamplingFreq=atoi(B);&wSmpData[0][0], &ulSmplNum);
sprintf(dummy,"%f",(10.0*wSmpData[0][0]/65536-5.0)/2.0);
m_e1ch=du mmy;
sprintf(dummy,"%f",(10.0*wSmpData[1][0]/65536-5.0)/2.0);
m_e2ch=dummy;
sprintf(dummy,

SamplingNum=SamplingPeriod*60*SamplingFreq;char dsp[100];
sprintf(dsp,"%d",SamplingNum);"%f",(10.0*wSmpData[2][0]/65536-5.0)/2.0);
m_e3ch=dummy;
sprintf(dummy,

82"%f",(10.0*wSmpData[3][0]/65536-5.0)/2.0);

yold4=ynew4;m_e4ch=dummy;
sprin tf(dummy,"%f",(10.0*wSmpData[4][0]/65536-5.0)/2.0);

MazendaPen.CreatePen(PS_SOLID,1,RGB(255,0,255));

m_e5ch=dummy;p D C ->SelectObject(&MazendaPen);//描画

p D C ->MoveTo(xa,yold5);

ch1=atoi(m_e1ch)*100.0;

p D C ->LineTo(x2,ynew5);

ch2=atoi(m_e2ch)*100.0;

yold5=ynew5;

ch3=atoi(m_e3ch)*100.0;

xa=x2;

ch4=atoi(m_e4ch)*100.0;

if(x1>410){

ch5=atoi(m_e5ch)*100.0;

CDC*pDC=m_pict.GetDC();x1=x1+1;

CRect myRECT;x2=x1;

m_pict.GetClientRect(myRECT);

ynew1=((ch1/4)-200)*-1;
ynew2=((ch2/4) -200)*-1;

pDC->FillSolidRect(myRECT,RGB(255,255,255));

ynew3=((ch3/4)-200)*-1;
ynew4=((ch4/4)-200)*-1;

pDC->SelectObject(&BrackPen);

ynew5=((ch5/4)-200)*-1;
CDC* pDC=m_pict.GetDC();

pDC->MoveTo(0,200);CPen

p D C ->LineTo(410,200);

BluePen,RedPen,GreenPen,BrackPen,CianPen,Mazen

p D C ->MoveTo(10,0);daPen;

p D C ->LineTo(10,310);
x1=9;RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));xa=10;

p D C ->SelectObject(&RedPen);yold1=200;yold2=200;

p D C ->MoveTo(xa,yold1);

yold3=200;yold4=200;yold5=200;

p D C ->LineTo(x2,ynew1);}

yold1=ynew1;

UpdateData(false);
CDialog::OnTimer(nIDEvent);

BluePen.CreatePen(PS_SOLID,1,RGB(0,0,255));}

p D C ->SelectObject(&BluePen);p D C ->MoveTo(xa,yold2);

void CMyDlg::OnStop()

p D C ->LineTo(x2,ynew2);{

yold2=ynew2;// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してくださいGreenPen.CreatePen(PS_SOLID,1,RGB(0,255,0));m_message="測定を停止します";p D C ->SelectObject(&GreenPen);

KillTimer(1);p D C ->MoveTo(xa,yold3);

m_stop.EnableWindow(FALSE);

p D C ->LineTo(x2,ynew3);m_start.EnableWindow(TRUE);

yold3=ynew3;

UpdateData(false);}

CianPen.CreatePen(PS_SOLID,1,RGB(0,255,255));
p D C ->SelectObject(&CianPen);

void CMyDlg::OnServercon()p D C ->MoveTo(xa,yold4);{

p D C ->LineTo(x2,ynew4);/*// TODO: この位置にコントロール通知ハン

83

sock->SockWrite(sData);

ドラ用のコードを追加してください
sock = new CComm;if(sock->Initialize("210.163.149.97")

UpdateData(false);==

false) {sprintf(sData.command, "h"); */}sock->~CComm();
AfxMessageBox("socket connect
failed");void CMyDlg::OnCheck3(){}*/// TODO: この位置にコントロール通知ハン}

ドラ用のコードを追加してください/*

if(m_Ch3 == TRUE){

void CMyDlg::OnCheck1()

m_Ch3 = FALSE;{/*

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="背面左ヒーター停止";}

ドラ用のコードを追加してください
if(m_Ch1 == TRUE){

else if (m_Ch3 == FALSE){

m_Ch1 = FALSE;

m_Ch3 = TRUE;

sData.fv[0] = double(0);sData.fv[0] = double(1);m_message ="前面左ヒーター停止";

m_message ="背面左ヒーター稼動";}
else if (m_Ch1 == FALSE){}

m_Ch1 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="前面左ヒーター稼動";

sprintf(sData.command, "i"); */}}sock->SockWrite(sData);

void CMyDlg::OnCheck4()

UpdateData(false);{

sprintf(sData.command, "g"); */}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください/*

if(m_Ch4 == TRUE){

void CMyDlg::OnCheck2()

m_Ch4 = FALSE;{

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="背面右ヒーター停止";

ドラ用のコードを追加してください}/*

else if (m_Ch4 == FALSE){

if(m_Ch2 == TRUE){
m_Ch2 = FALSE;

m_Ch4 = TRUE;

sData.fv[0] = double(0);sData.fv[0] = double(1);m_message ="前面右ヒーター停止";

m_message ="背面右ヒーター稼動";}
else if (m_Ch2 == FALSE){}

m_Ch2 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="前面右ヒーター稼動";

sprintf(sData.command, "j"); */
}

}

84

void CMyDlg::OnCheck5()

m_Ch7 = FALSE;{

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="ATC 側前ヒーター停止";

ドラ用のコードを追加してください}/*

else if (m_Ch7 == FALSE){

if(m_Ch5 == TRUE){
m_Ch5 = FALSE;

m_Ch7 = TRUE;

sData.fv[0] = double(0);sData.fv[0] = double(1);m_message ="側面前ヒーター停止";

m_message ="ATC 側前ヒーター稼動";}
else if (m_Ch5 == FALSE){}

m_Ch5 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="側面前ヒーター稼動";

sprintf(sData.command, "m"); */}}sock->SockWrite(sData);

void CMyDlg::OnCheck8()

UpdateData(false);{

sprintf(sData.command, "k"); */}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください/*

if(m_Ch8 == TRUE){

void CMyDlg::OnCheck6()

m_Ch8 = FALSE;{

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="ATC 側後ヒーター停止";

ドラ用のコードを追加してください}/*

else if (m_Ch8 == FALSE){

if(m_Ch6 == TRUE){
m_Ch6 = FALSE;

m_Ch8 = TRUE;

sData.fv[0] = double(0);sData.fv[0] = double(1);m_message ="側面後ヒーター停止";

m_message ="ATC 側後ヒーター稼動";}
else if (m_Ch6 == FALSE){}

m_Ch6 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="側面後ヒーター稼動";

sprintf(sData.command, "n"); */}}sock->SockWrite(sData);

void CMyDlg::OnCheck9()

UpdateData(false);{

sprintf(sData.command, "l"); */}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください/*

if(m_ch9 == TRUE){

void CMyDlg::OnCheck7()

ch9 = FALSE;{

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="前面冷却ファン停止";

ドラ用のコードを追加してください}/*

else if (ch9 == FALSE){

if(m_Ch7 == TRUE){85

ch9 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="前面冷却ファン稼動";

sprintf(sData.command, "b"); */}}sock->SockWrite(sData);

void CMyDlg::OnCheck12()

UpdateData(false);{

sprintf(sData.command, "a"); */}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください/*

void CMyDlg::OnCheck10()if(m_ch12 == TRUE){
m_ch12 = FALSE;{

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="側面後冷却ファン停止";

ドラ用のコードを追加してください}/*

else if (m_ch12 == FALSE){

if(m_ch10 == TRUE){
m_ch10 = FALSE;

m_ch12 = TRUE;

sData.fv[0] = double(0);sData.fv[0] = double(1);m_message ="背面冷却ファン停止";

m_message ="側面後冷却ファン稼動";}
else if (m_ch10 == FALSE){}

m_ch10 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="背面冷却ファン稼動";

sprintf(sData.command, "e"); */}}sock->SockWrite(sData);

void CMyDlg::OnCheck13()

UpdateData(false);{

sprintf(sData.command, "c"); */}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください/*

if(m_ch13 == TRUE){

void CMyDlg::OnCheck11()

m_ch13 = FALSE;{

sData.fv[0] = double(0);// TODO: この位置にコントロール通知ハン

m_message ="ATC 側前冷却ファン停止";

ドラ用のコードを追加してください}/*

else if (m_ch13 == FALSE){

if(m_ch11 == TRUE){
m_ch11 = FALSE;

m_ch13 = TRUE;

sData.fv[0] = double(0);sData.fv[0] = double(1);m_message ="側面前冷却ファン停止";

m_message ="ATC 側前冷却ファン稼動";}
else if (m_ch11 == FALSE){}

m_ch11 = TRUE;

sock->SockWrite(sData);sData.fv[0] = double(1);UpdateData(false);

m_message ="側面前冷却ファン稼動";

sprintf(sData.command, "f"); */
}

}

86

void CMyDlg::OnCheck14(){// TODO: この位置にコントロール通知ハン

static double n;

ドラ用のコードを追加してください

static char/*static bool StartFlag = false;

if(m_ch14 == TRUE){

dummy[256];m_ch14 = FALSE;
sData.fv[0] = double(0);#include "pcpg46.h"m_message ="ATC 側後冷却ファン停止";#include"windows.h"}#include"stdio.h"

else if (m_ch14 == FALSE){#include"FbiAd.h"m_ch14 = TRUE;
sData.fv[0] = double(1);#define AXIS_NUM 3

m_message ="ATC 側後冷却ファン稼動";
HANDLE hDeviceHandle;}

ADSMPLCHREQ SmplChReq[3];sock->SockWrite(sData);

WORD wSmpData[3];UpdateData(false);
sprintf(sData.command, "d"); */}int adDataOrg[AXIS_NUM];
int adDataCal[AXIS_NUM];
double mstPerBit[AXIS_NUM];
double nonIntfMatrix[AXIS_NUM][AXIS_NUM];

遠隔操作プログラム

double newtonPerMst[AXIS_NUM];// MCOperDlg.cpp : インプリメンテーション ファイル

double//newtonPerMstMatrix[AXIS_NUM][AXIS_NUM];/*

newtonPerMst * nonIntfMatrix */#include "stdafx.h"

double#include "MCOper.h"sensorNon[AXIS_NUM][AXIS_NUM];/* newtonPerMstMatrix * newtonPerMst */#include "MCOperDlg.h"double meanForce[AXIS_NUM];//int counter;#ifdef _DEBUG

static int joystickStart = 0;

#define new DEBUG_NEW

static int m_handlemode = -1;#undef THIS_FILE

pcpg46 pcpg;

static char THIS_FILE[] = __FILE__;
int tu,xa,ya,yb,yc,y1,y2,y3,x1,xnew,xold,y4,ynew,yold;TCHAR

int kakou,tikara,henkei,MappingModel;

szBuf[1024];#endif

BYTE
bData[256];#define READTIMER_ID

0

WORD

static S_DATA

sData,rData;

wBsn, wAxis;

static HANDLE

g_hThread;

PCPG46RESOURCE ri;

static CComm*

sock;

BYTE

//static void session();

b;
DWORD

//static int counter;

dwCount;87}/////////////////////////////////////////////////////////////////////////////// アプリケーションのバージョン情報で使われている

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

CAboutDlg ダイアログ//{{AFX_MSG_MAP(CAboutDlg)// メッセージ ハンドラがありま

class CAboutDlg : public CDialog

せん。

{//}}AFX_MSG_MAP

public:

END_MESSAGE_MAP()
CAboutDlg();/////////////////////////////////////////////////////////////////////////////// CMCOperDlg ダイアログ// ダイアログ データ

CMCOperDlg::CMCOperDlg(CWnd*//{{AFX_DATA(CAboutDlg)

pParent/*=NULL*/)

enum { IDD = IDD_ABOUTBOX };: CDialog(CMCOperDlg::IDD, pParent)//}}AFX_DATA{//{{AFX_DATA_INIT(CMCOperDlg)// ClassWizard は仮想関数のオーバーライ

m_rely = _T("");
m_relz = _T("");

ドを生成します//{{AFX_VIRTUAL(CAboutDlg)

m_absx = _T("");

protected:

m_absy = _T("");

virtualDoDataExchange(CDataExchange*

void
pDX);

//

DDX/DDV のサポート//}}AFX_VIRTUAL

m_absz = _T("");
m_spindle = _T("");
m_feed = _T("");
m_message = _T("");
m_ncprog = _T("");// インプリメンテーション

NCNAME = _T("");

protected:

m_macx = _T("");//{{AFX_MSG(CAboutDlg)

m_macy = _T("");//}}AFX_MSG

m_macz = _T("");

DECLARE_MESSAGE_MAP()

m_relx = _T("");};

m_remx = _T("");
m_remy = _T("");

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

m_remz = _T("");{

m_feedover = 100;//{{AFX_DATA_INIT(CAboutDlg)

m_spindleover = 100;//}}AFX_DATA_INIT

m_sm = 0;}m_fm = 0;
m_tuyox = _T("");

void

CAboutDlg::DoDataExchange(CDataExchange*

m_tuyoy = _T("");

pDX)

m_tuyoz = _T("");{

m_fx = _T("");
CDialog::DoDataExchange(pDX);

m_fy = _T("");//{{AFX_DATA_MAP(CAboutDlg)

m_fz = _T("");//}}AFX_DATA_MAP

m_C1 = FALSE;

88

m_C2 = FALSE;

m_pcpgadClose);

m_C3 = FALSE;DDX_Control(pDX,

m_C4 = FALSE;
m_C5 = FALSE;DDX_Control(pDX,

m_C6 = FALSE;

IDC_FORCEBUTTON1, m_foce);m_Ch1 = FALSE;
m_Ch2 = FALSE;
m_Ch4 = FALSE;
m_Ch6 = FALSE;DDX_Control(pDX,

IDC_NCSEND4,

DDX_Control(pDX,

IDC_NCSEND8,

DDX_Control(pDX,

IDC_NCSEND6,

DDX_Control(pDX,

IDC_NCSEND7,

DDX_Control(pDX,

IDC_NCSEND3,

DDX_Control(pDX,

IDC_BUTTON2,

m_yp);

m_Ch7 = FALSE;
m_Ch8 = FALSE;m_xm);//}}AFX_DATA_INIT
LoadIcon

IDC_NCSEND5,m_ym);

m_Ch5 = FALSE;

メ モ :DDX_Control(pDX,
m_xp);

m_Ch3 = FALSE;//

IDC_PCPGAD_INIT,

m_pcpgadInit);

は

Win32

の

m_zm);=m_zp);

DestroyIcon のサブシーケンスを要求しません。
m_hIconAfxGetApp()->LoadIcon(IDR_MAINFRAME);}

m_dncend);
DDX_Control(pDX,

void

IDC_BUTTON1,

m_dncstart);

CMCOperDlg::DoDataExchange(CDataExchange*
pDX)

DDX_Control(pDX,
IDC_SCROLLBAR_SPINDLE, m_spindlescrol);{

DDX_Control(pDX,
CDialog::DoDataExchange(pDX);IDC_SCROLLBAR_FEED, m_feedscrol);//{{AFX_DATA_MAP(CMCOperDlg)

DDX_Control(pDX,

DDX_Control(pDX,

IDC_BUTTON7,

m_tikara);

m_ncsend);
DDX_Control(pDX,

DDX_Control(pDX,

IDC_BUTTON8,

m_hssbo pen);

IDC_BUTTON5,

m_hssbcolse);

m_henkei);
DDX_Control(pDX,

DDX_Control(pDX,

m_kakou);

DDX_Control(pDX,
DDX_Control(pDX,

IDC_BUTTON4,

m_spinstart);
DDX_Control(pDX,
DDX_Control(pDX,

IDC_BUTTON6,

m_emegstop);

IDC_BUTTON3,

m_ciclestart);

DDX_Control(pDX,

m_stop);

IDC_HSSBOPEN,
IDC_HSSBCOLSE,
IDC_FEEDHOLD,

m_feedhold);
DDX_Control(pDX,

m_spinstop);

IDC_NCSEND,IDC_EMEGSTOP,IDC_CICLESTART,DDX_Text(pDX, IDC_RELY, m_rely);
DDX_Control(pDX, IDC_PICT, m_pict);

DDX_Text(pDX, IDC_RELZ, m_relz);

DDX_Control(pDX, IDC_AXISX, m_axisx);

DDX_Text(pDX, IDC_ABSX, m_absx);

DDX_Control(pDX, IDC_JOYSTICK_STOP,

DDX_Text(pDX, IDC_ABSY, m_absy);m_joystickStop);
DDX_Control(pDX,
IDC_JOYSTICK_START, m_joystickStart);
DDX_Control(pDX, IDC_PCPGAD_CLOSE,

DDX_Text(pDX, IDC_ABSZ, m_absz);
DDX_Text(pDX,

IDC_EDIT_SPINDLE,

m_spindle);
DDX_Text(pDX,

IDC_EDIT_FEED,

89

m_feed);ON_WM_SYSCOMMAND()
DDX_Text(pDX,

IDC_EDIT_MESSA,

ON_WM_PAINT()

m_message);
DDX_Text(pDX,

ON_WM_QUERYDRAGICON()
IDC_EDIT_NCPROG,

m_ncprog);
DDX_Text(pDX,

ON_BN_CLICKED(IDC_HSSBOPEN,
OnHssbopen)

IDC_NCNAME,

NCNAME);

ON_BN_CLICKED(IDC_NCSELECT,
OnNcselect)

DDX_Text(pDX, IDC_MACX, m_macx);
DDX_Text(pDX, IDC_MACY, m_macy);

ON_BN_CLICKED(IDC_NCSEND,
OnNcsend)

DDX_Text(pDX, IDC_MACZ, m_macz);
DDX_Text(pDX, IDC_RELX, m_relx);

ON_BN_CLICKED(IDC_CICLESTART,
OnCiclestart)

DDX_Text(pDX, IDC_REMX, m_remx);
DDX_Text(pDX, IDC_REMY, m_remy);

ON_BN_CLICKED(IDC_FEEDHOLD,
OnFeedhold)

DDX_Text(pDX, IDC_REMZ, m_remz);
DDX_Scroll(pDX,

ON_BN_CLICKED(IDC_EMEGSTOP,
OnEmegstop)

IDC_SCROLLBAR_FEED, m_feedover);
DDX_Scroll(pDX,

ON_BN_CLICKED(IDC_HSSBCOLSE,
OnHssbcolse)

IDC_SCROLLBAR_SPINDLE, m_spindleover);ON_WM_TIMER()

DDX_Text(pDX, IDC_EDIT1, m_sm);

ON_WM_HSCROLL()

DDX_Text(pDX, IDC_EDIT2, m_fm);

ON_BN_CLICKED(IDC_EXIT, OnExit)

DDX_Text(pDX, IDC_tuyoX, m_tuyox);

ON_BN_CLICKED(IDC_NCSEND8,

DDX_Text( pDX, IDC_tuyoY, m_tuyoy);

OnNcsend8)

DDX_Text(pDX, IDC_tuyoZ, m_tuyoz);
DDX_Text(pDX, IDC_FORCEX, m_fx);

ON_BN_CLICKED(IDC_NCSEND4,
OnNcsend4)

DDX_Text(pDX, IDC_FORCEY, m_fy);
DDX_Text(pDX, IDC_FORCEZ, m_fz);

ON_BN_CLICKED(IDC_NCSEND5,
OnNcsend5)

DDX_Check(pDX, IDC_CHECK10, m_C1);
DDX_Check(pDX, IDC_CHECK11, m_C2);

ON_BN_CLICKED(IDC_NCSEND6,
OnNcsend6)

DDX_Check(pDX, IDC_CHECK12, m_C3);
DDX_Check(pDX, IDC_CHECK13, m_C4);

ON_BN_CLICKED(IDC_NCSEND3,
OnNcsend3)

DDX_Check(pDX, IDC_CHECK14, m_C5);
DDX_Check(pDX, IDC_CHECK15, m_C6);

ON_BN_CLICKED(IDC_NCSEND7,
OnNcsend7)

DDX_Check(pDX, IDC_CHECK1, m_Ch1);
DDX_Check(pDX, IDC_CHECK2, m_Ch2);

ON_BN_CLICKED(IDC_RADIO1,
OnRadio1)

DDX_Check(pDX, IDC_CHECK3, m_Ch3);
DDX_Check(pDX, IDC_CHECK4, m_Ch4);

ON_BN_CLICKED(IDC_RADIO2,
OnRadio2)

DDX_Check(pDX, IDC_CHECK5, m_Ch5);
DDX_Check(pDX, IDC_CHECK6, m_Ch6);
DDX_Check(pDX, IDC_CHECK7, m_Ch7);
DDX_Check(pDX, IDC_CHECK8, m_Ch8);//}}AFX_DATA_MAP}

ON_BN_CLICKED(IDC_RADIO3,
OnRadio3)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
ON_EN_CHANGE(IDC_EDIT1,

BEGIN_MESSAGE_MAP(CMCOperDlg, CDialog)//{{AFX_MSG_MAP(CMCOperDlg)

OnChangeEdit1)
ON_EN_CHANGE(IDC_EDIT2,

90

OnChangeEdit2)
ON_BN_CLICKED(IDC_FORCEBUTTON

ON_BN_CLICKED(IDC_CHECK7,
OnCh7)

1, OnForcebutton1)
ON_BN_CLICKED(IDC_PCPGAD_INIT,

ON_BN_CLICKED(IDC_CHECK8,
OnCh8)

OnPcpgadInit)
ON_BN_CLICKED(IDC_PCPGAD_CLOS

ON_BN_CLICKED(IDC_BUTTON5,
Onkakou)

E, OnPcpgadClose)
ON_BN_CLICKED(IDC_JOYSTICK_STO

ON_BN_CLICKED(IDC_BUTTON8,
Onhenkei)P, OnJoystickStop)
ON_BN_CLICKED(IDC_JOYSTICK_STA

ON_BN_CLICKED(IDC_BUTTON7,
Ontikara)

RT, OnJoystickStart)
ON_BN_CLICKED(IDC_HANDLEMODE,//}}AFX_MSG_MAP
END_MESSAGE_MAP()

OnHandlemode)
ON_BN_CLICKED(IDC_BUTTON3,
OnButton3)/////////////////////////////////////////////////////////////////////////////// CMCOperDlg メッセージ ハンドラ

ON_BN_CLICKED(IDC_JOYSTICKMOD
E, OnJoystickmode )ON_BN_CLICKED(IDC_BUTTON6,

BOOL CMCOperDlg::OnInitDialog(){

OnSPINDLESTOP)

CDialog::OnInitDialog();

ON_BN_CLICKED(IDC_BUTTON4,OnSindleStart)
ON_BN_CLICKED(IDC_CHECK10,// "バージョン情報..." メニュー項目をシステ
ム メニューへ追加します。

OnC1)
ON_BN_CLICKED(IDC_CHECK11,OnC2)// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。

ON_BN_CLICKED(IDC_CHECK12,OnC3)ASSERT((IDM_ABOUTBOX & 0xFFF0)== IDM_ABOUTBOX);

ON_BN_CLICKED(IDC_CHECK13,ASSERT(IDM_ABOUTBOX < 0xF000);

OnC4)
ON_BN_CLICKED(IDC_CHECK14,
OnC5)

CMenu*

pSysMenu=

GetSystemMenu(FALSE);
ON_BN_CLICKED(IDC_CHECK15,

if (pSysMenu != NULL)

OnC6)

{
ON_BN_CLICKED(IDC_CHECK1,

CString strAboutMenu;

OnCh1)
ON_BN_CLICKED(IDC_CHECK2,
OnCh2)

strAboutMenu.LoadString(IDS_ABOUTB
OX);

ON_BN_CLICKED(IDC_CHECK3,

if (!strAboutMenu.IsEmpty())

OnCh3){
ON_BN_CLICKED(IDC_CHECK4,

OnCh4)

pSysMenu->AppendMenu(MF_SEPARATO
ON_BN_CLICKED(IDC_CHECK5,R);

OnCh5)
ON_BN_CLICKED(IDC_CHECK6,
OnCh6)

pSysMenu->AppendMenu(MF_STRING,
IDM_ABOUTBOX, strAboutMenu);

91}m_ym.EnableWindow(FALSE);}

m_zm.EnableWindow(FALSE);
m_kakou.EnableWindow(FALSE);// このダイアログ用のアイコンを設定しま

m_henkei.EnableWindow(FALSE);
m_tikara.EnableWindow(FALSE);

す。フレームワークはアプリケーションのメイン// ウィンドウがダイアログでない時は自動

m_pcpgadInit.EnableWindow(FALSE);
m_pcpgadClose.EnableWindow(FALSE);的に設定しません。
SetIcon(m_hIcon, TRUE);

m_joystickStart.EnableWindow(FALSE);// 大きいアイコンを設定

m_joystickStop.EnableWindow(FALSE);

SetIcon(m_hIcon, FALSE);

m_spinstart.EnableWindow(FALSE);// 小さいアイコンを設定

m_spinstop.EnableWindow(FALSE);// TODO: 特別な初期化を行う時はこの場所に追加してください。

return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

m_hsfeedover=(CScrollBar* )GetDlgItem(IDC_SCROLLBAR_FEED);
m_hsfeedover ->SetScrollRange(20,200);

void

CMCOperDlg::OnSysCommand(UINTnID,

LPARAM lParam){

m_hsfeedover ->SetScrollPos(100);if ((nID & 0xFFF0) == IDM_ABOUTBOX){=

CAboutDlg dlgAbout;(CScrollBar* )GetDlgItem(IDC_SCROLLBAR_SPIND

m_hsspindleover

dlgAbout.DoModal();LE);}
m_hsspindleover

else->SetScrollRange(20,200);{m_hsspindleover ->SetScrollPos(100);

CDialog::OnSysCommand(nID,lParam);m_hssbopen.EnableWindow(TRUE);
m_hssbcolse.EnableWindow(FALSE);}}

m_ciclestart.EnableWindow(FALSE);
m_feedhold.EnableWindow(FALSE);// もしダイアログボックスに最小化ボタンを追加するな

m_ciclestart.EnableWindow(FALSE);

らば、アイコンを描画する

m_ncsend.EnableWindow(FALSE);// コードを以下に記述する必要があります。MFC アプ

m_feedscrol.EnableWindow(FALSE);

リケーションは document/view

m_spindlescrol.EnableWindow(FALSE);// モデルを使っているので、この処理はフレームワーク

m_emegstop.EnableWindow(FALSE);

により自動的に処理されます。

m_dncstart.EnableWindow(FALSE);
m_dncend.EnableWindow(FALSE);
m_foce.EnableWindow(FALSE);

void CMCOperDlg::OnPaint(){

m_stop.EnableWindow(FALSE);

if (IsIconic())

m_xp.EnableWindow(FALSE);{

m_yp.EnableWindow(FALSE);
m_zp.EnableWindow(FALSE);
m_xm.EnableWindow(FALSE);

CPaintDC dc(this); // 描画用のデバイス コンテキスト

92counter = 1 ;SendMessage(WM_ICONERASEBKGND,

while( counter ) {(WPARAM) dc.GetSafeHdc(), 0);//m_relz=pos;// クライアントの矩形領域内のsprintf(pos,"%5.3f", (double)counter++);// m_absx=pos;

中央
int

cxIcon=cyIcon=// m_relx=pos;

GetSystemMetrics(SM_CXICON);int// dlg.UpdateData(false);

GetSystemMetrics(SM_CYICON);//int(8),FALSE);

CRect rect;
GetClientRect(&rect);

SetDlgItemInt(NULL,IDC_RELX,//

CWnd * pEd = (CWnd *)GetDlgItem(IDC_EDIT_MESSA);

int x = (rect.Width() - cxIcon +//1) / 2;

SetDlgItemInt(NULL,IDC_RELX,
int y = (rect.Height() - cyIcon +counter++,FALSE);

1) / 2;//

SetDlgItemInt(

ghWnd,

IDD_COUNT, counter++, FALSE ) ;// アイコンを描画します。

// New function added by me

dc.DrawIcon(x, y, m_hIcon);if((counter%100)==0)}

Beep(400,200);

else

Sleep( 100 ) ;{CDialog::OnPaint();}}}

ExitThread( 0 ) ;}*/// システムは、ユーザーが最小化ウィンドウをドラッグしている間、

void CMCOperDlg::OnHssbopen()// カーソルを表示するためにここを呼び出します。

{

HCURSOR CMCOperDlg::OnQueryDragIcon(){// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

return (HCURSOR) m_hIcon;}/*
if( hThread == NULL) {threadID = 0 ;// createa threadvolatile unsigned int counter ;hThread = CreateThread( 0, 0,

int pos_x=0;
static HANDLE hThread = NULL ;static DWORD threadID = 0 ;(LPTHREAD_START_ROUTINE)countTh
read,

/*
void countThread( void )0, 0, &threadID ) ;{}char pos[20];DWORD threadID;

93

*/

OFN_FILEMUSTEXIST
sock = new CComm;
if

OFN_HIDEREADONLY,(sock->Initialize("210.163.149.97")==|//ダイアログのカス

タマイズ

false) {"NC プログラム(*.out)|*.out|すsock->~CComm();べて(*.*)|*.*||"

AfxMessageBox("socket connect//フィルタ);failed");}// !! 初期ディレクトリ 要変更 !!
FileDLG.m_ofn.lpstrInitialDir// timer="D:¥¥ljq¥¥teleokk¥¥MCOper";

SetTimer(READTIMER_ID,10,NULL);
if(FileDLG.DoModal()==IDOK){
m_hssbopen.EnableWindow(FALSE);
m_hssbcolse.En ableWindow(TRUE);

CStdioFile
fin(FileDLG.GetPathName(),CFile::modeRead);m_feedhold.EnableWindow(TRUE);

m_ncprog.Empty();m_ciclestart.EnableWindow(TRUE);
m_feedscrol.EnableWindow(TRUE);

while(fin.ReadString(buf,255)!=NULL){

m_spindlescrol.EnableWindow(TRUE);

len = strlen(buf);

m_emegstop.EnableWindow(TRUE);

buf[len-1] = '¥0';m_dncstart.EnableWindow(TRUE);

m_ncprog += buf;

m_kakou.EnableWindow(TRUE);

m_ncprogm_henkei.EnableWindow(TRUE);+="¥r¥n";

m_tikara.EnableWindow(TRUE);

line_num++;}m_message+="Connection

Established.¥r¥n";

NCNAME=
FileDLG.GetFileName();UpdateData(false);}
m_ncsend.EnableWindow(TRUE);}

UpdateData(false);

void CMCOperDlg::OnNcselect()}{// TODO: この位置にコントロール通知ハン

void CMCOperDlg::OnNcsend(){

ドラ用のコードを追加してください// TODO: この位置にコントロール通知ハンcharbuf[256];

int

ドラ用のコードを追加してください
len,line_num=0;char buf[255];

CFileDialog FileDLG(
true,

int len, line_num;//[ファイ//int Datlen, ProgNumOrg;// デ フ ォ// TODO: この位置にコントロール通知ハン

ルを開く]ダイアログボックス"out",
ルト拡張子

ドラ用のコードを追加してください"*.out",ル名//デフォルトファイ

m_message ="NC Program Send.";UpdateData(false);

94}
sprintf(sData.command,"NC

programs o c k ->SockWrite(sData);

send %d", counter);UpdateData(false);sData.fv[0] = double(counter);}sData.fv[1] = double(counter+1);//File send oversData.fv[2] = double(counter+2);

buf[0] = '%';

sock->SockWrite(sData);

strcpy(sData.command,buf);
sock->SockWrite(sData);// NC プログラムを受信し、MC へ転送
int j = 0;// NC プログラム転送終了
m_message += "FileTrans Done.";CStdioFile

m_message += "¥r¥n";fin(NCNAME,CFile::modeRead|CFile::typeText);

UpdateData(false);

m_ncprog.Empty();}while(fin.ReadString( buf,255)!=NULL){

void CMCOperDlg::OnCiclestart()

len = strlen(buf);{

strcpy(sData.command, buf);// TODO: この位置にコントロール通知ハン

buf[len-1] = '¥0';

ドラ用のコードを追加してください

m_ncprog += buf;
m_ncprogsprintf(sData.command, "Cycle start from+=client %d", counter);"¥r¥n";

sData.fv[0] = double(counter);line_num++;sData.fv[1] = double(counter+1);
sData.fv[2] = double(counter+2);

if(sData.command[0] == 'O') {sock->SockWrite(sData);

int i,num;m_message ="CICLE START";char

UpdateData(false);

NCNum[256];

}
for

(i=0;

i<len-2;i++){void CMCOperDlg::OnFeedhold()
NCNum[i] ={buf[i+1];// TODO: この位置にコントロール通知ハン}num

ドラ用のコードを追加してください=atoi(NCNum);

sprintf(sData.command,from client . %d", counter);sData.fv[0] = double(num);sData.fv[0] = double(counter);sprintf(NCNum, " NC prog num %dsData.fv[1] = double(counter+1);",num);

sData.fv[2] = double(counter+2);
sock->SockWrite(sData);
m_message = NCNum;m_message ="FEED HOLD";

UpdateData(false);}else{

UpdateData(false);}sData.fv[0] = double(counter);sData.fv[1] = double(counter+1);

void CMCOperDlg::OnEmegstop()sData.fv[2] = double(counter+2);{"Holding

Feed

95

// TODO: この位置にコントロール通知ハン*/

ドラ用のコードを追加してください
sprintf(sData.command, "Emg. stop from

KillTimer(READTIMER_ID);

client %d", counter);StartFlag = false;sData.fv[0] = double(counter);sData.fv[1] = double(counter+1);

m_hssbopen.EnableWindow(TRUE);

sData.fv[2] = double(counter+2);

m_hssbcolse.EnableWindow(FALSE);

sock->SockWrite(sData);

m_ciclestart.EnableWindow(FALSE);

KillTimer(READTIMER_ID);m_feedhold.EnableWindow(FALSE);
m_ciclestart.EnableWindow(FALSE);

m_hssbopen.EnableWindow(TRUE);

m_ncsend.EnableWindow(FALSE);

m_hssbcolse.EnableWindow(FALSE);

m_feedscrol.EnableWindow(FALSE);

m_ciclestart.EnableWindow(FALSE);

m_spindlescrol.EnableWindow(FALSE);

m_feedhold.EnableWindow(FALSE);

m_emegstop.EnableWindow(FALSE);

m_ciclestart.EnableWindow(FALSE);
m_ncsend.EnableWindow(FALSE);

m_message ="HSSB CLOSE";

m_feedscrol.EnableWindow(FALSE);

UpdateData(false);

m_spindlescrol.EnableWindow(FALSE);
m_emegstop.EnableWindow(FALSE);}

m_message ="EMEG. STOP";
UpdateData(false);

void CMCOperDlg::OnHScroll(UINT nSBCode, UINT}

nPos, CScrollBar *pScrollBar){

void CMCOperDlg::OnHssbcolse()

int pos, x, xmin, xmax;{//char text[20];// TODO: この位置にコントロール通知ハン
pScrollBar->GetScrollRange(&xmin,

ドラ用のコードを追加してください
counter = 0 ;/*&xmax);
if(

hThread!=

NULL) {

pos = pScrollBar->GetScrollPos();x = pos;//

wait

until the thread has finishedswitch(nSBCode){while( WaitForSingleObject(hThread, 0) ==case SB_LINELEFT:

WAIT_TIMEOUT)

x-=2;
//

SetDlgItemText( hWnd, IDD_COUNT, "待つ." ) ;

break ;
case SB_LINERIGHT:
x+=2;

//

break;

SetDlgItemText( hWnd, IDD_COUNT, "スcase SB_PAGELEFT:

レッド終わり." ) ;x-=10;
hThread= NULL ;break;
case SB_PAGERIGHT:}

x+=10;

96

break;{

case SB_THUMBTRACK:// TODO: この位置にメッセージ ハンドラ

x=nPos;用のコードを追加するかまたはデフォルトの処理を呼び

break;

出してくださいdefault:

int axis, index;
return;double force[AXIS_NUM];}
if(x<xmin) x=xmin;

if(nIDEvent == READTIMER_ID)

else if(x>xmax) x=xmax;{

if(x!=pos)rData.command[0] = NULL;{

sock->SockRead(&rData);
pScrollBar->SetScrollPos(x);// Get Relative axis position.
if (rData.command[0] =='R'){

if(pScrollBar == m_hsfeedover){//sprintf(text,s p r intf(dummy,"%.3f",rData.fv[0]);

"%d",

x);

m_relx = dummy;
sprintf(dummy,"%.3f",rData.fv[1]);m_feedover = x;m_message ="FEED

m_rely = dummy;
sprintf(dummy,"%.3f",rData.fv[2]);OVERRIDE";

m_relz = dummy;
sprintf(sData.command,"Feedoverride from client %d", x);}else// Get machine axis position.

sData.fv[0] = double(x);if (rData.command[0] =='M'){
sprintf(dummy,"%.3f",rData.fv[0]);}m_macx = dummy;else

if(pScrollBar==m_hsspindleover){sprintf(dummy,"%.3f",rData.fv[1]);m_macy = dummy;// sprintf(text, "%d", x);m_spindleover = x;m_message="SPINDLE OVERRIDE";
sprintf(sData.command, "Spindle
override from client %d", x);

sprintf(dummy,"%.3f",rData.fv[2]);m_macz = dummy;}else// Get absolute axis position.
if (rData.command[0] =='A'){
sprintf(dummy,"%.3f",rData.fv[0]);sData.fv[0] = double(x);m_absx = dummy;}

sprintf(dummy,"%.3f",rData.fv[1]);sData.fv[1] = double(counter+1);

m_absy = dummy;sData.fv[2] = double(counter+2);

sprintf(dummy,"%.3f",rData.fv[2]);s o c k ->SockWrite(sData);

m_absz = dummy;}elseUpdateData(false);// Get remain moving distanceif (rData.command[0] =='N'){}}

sprintf(dummy,"%.3f",rData.fv[0]);m_remx = dummy;
sprintf(dummy,"%.3f",rData.fv[1]);m_remy = dummy;

void CMCOperDlg::OnTimer(UINT nIDEvent)sprintf(dummy,"%.3f",rData.fv[2]);97m_remz = dummy;"%lf",meanForce[0]);}elsem _ f x = dummy;if (rData.command[0] =='S'){

sprintf(dummy,// Get feed rate and spindle"%lf",meanForce[1]);speed.

m_fy=dummy;
sprintf(dummy,"%.3f",rData.fv[0]);sprintf(dummy,

m_feed = dummy;"%lf",meanForce[2]);sprintf(dummy,"%.3f",rData.fv[1]);m_fz=dummy;m_spindle = dummy;

UpdateData(false);}else

if (meanForce[0] >= 8.0){
if

if(rData.command[0] =='K'){ //追加

(

FALSE

==

pcpg.Pcpg46wDataFullWrite(//力センサーデータ取得

wBsn,

sprintf(dummy,"%.3f",rData.fv[0]);wAxis,

PCPG46_PLUS_PRESET_PULSE_DRIVE, 100 ) ) {m_tuyox = dummy;
sprintf(dummy,"%.3f",rData.fv[1]);pcpg.ErrorMessage(wBsn);

m_tuyoy = dummy;

return ;}sprintf(dummy,"%.3f",rData.fv[2]);CButton*m_tuyoz = dummy;

radio1=(CButton*)GetDlgItem(IDC_AXISX);}if(joystickStart == 1){

CButton*

AdInputAD(hDeviceHandle,

3,

radio2=(CButton*)GetDlgItem(IDC_AXISY);

AD_INPUT_SINGLE, &SmplChReq[0], &wSmpData);for (axis = 0; axis < AXIS_NUM;
axis++)

CButton*radio3=(CButton*)GetDlgItem(IDC_AXISZ);
force[axis] = 0.0;
for (axis = 0; axis < AXIS_NUM; axis++) {for(index

=

0;

index

if(radio1->GetCheck()){<

AXIS_NUM; index++) {sprintf(sData.command, "X%d", counter);force[axis]+=

sensorNon[axis][index]*((int)wSmpData[index]-adDat

sData.fv[0] = double(1*n);aOrg[index]);sData.fv[1]
}
}
for

=

double(m_sm);
sData.fv[2]

(axis

=

0;

axis

<

=

double(m_fm);

AXIS_NUM; axis++)meanForce[axis]+=force[axis];

sock->SockWrite(sData);

counter++;sprintf(dummy,"Sif(counter == 5){

F %.0f mm/min X 方向へ

for (axis = 0; axis < AXIS_NUM;
axis++)

%.3f

%.0f

",sData.fv[1],sData.fv[2],sData.fv[0] );m_message = dummy;

meanForce[axis]=

UpdateData(false);

meanForce[axis]/10.0;
sprintf(dummy,rpmｍｍ動かします}98

pcpg.ErrorMessage(wBsn);
if(radio2->GetCheck()){

return ;}sprintf(sData.command, "Y%d", counter);

CButton*radio1=(CButton*)GetDlgItem(IDC_AXISX);sData.fv[0] = double(1*n);sData.fv[1]=double(m_sm);

CButton*radio2=(CButton*)GetDlgItem(IDC_AXISY);
sData.fv[2]=double(m_fm);

CButton*radio3=(CButton*)GetDlgItem(IDC_AXISZ);
sock->SockWrite(sData);
sprintf(dummy,"S
F %.0f mm/min Y 方向へ

%.3f

%.0f

rpm

if(radio1->GetCheck()){

ｍｍ動かします",sData.fv[1],sData.fv[2],sData.fv[0] );sprintf(sData.command, "X%d", counter);m_message = dummy;
UpdateData(false);sData.fv[0] = double(-1*n);sData.fv[1]}=double(m_sm);
sData.fv[2]if(radio3->GetCheck()){=

double(m_fm);

sprintf(sData.command, "Z%d", counter);sock->SockWrite(sData);
sprintf(dummy,"SsData.fv[0] = double(1*n);

F %.0f mm/min X 方向へ

sData.fv[1]

=

%.3f

%.0f

rpm

ｍｍ動かします",sData.fv[1],sData.fv[2],sData.fv[0] );double(m_sm);

m_message = dummy;sData.fv[2]=UpdateData(false);

double(m_fm);}
sock->SockWrite(sData);
sprintf(dummy,"S
F %.0f mm/min Z 方向へ

%.3f

%.0f

rpm

if(radio2->GetCheck()){

ｍｍ動かします",sData.fv[1],sData.fv[2],sData.fv[0] );sprintf(sData.command, "Y%d", counter);m_message = dummy;
UpdateData(false);sData.fv[0] = double(-1*n);sData.fv[1]}double(m_sm);}else

sData.fv[2]if (meanForce[0] <= -8.0){
if

(

FALSE

=
=

double(m_fm);==

pcpg.Pcpg46wDataFullWrite(

sock->SockWrite(sData);w B s n , wAxis,

PCPG46_MINUS_PRESET_PULSE_DRIVE, 100 ) ) {sprintf(dummy,"S
F %.0f mm/min Y 方向へ%.3f",sData.fv[1],sData.fv[2],sData.fv[0] );

%.0f

rpm

ｍｍ動かします99

m_message = dummy;pDC->SetMapMode(MappingModel);UpdateData(false);p D C ->SelectObject(&RedPen);pDC ->LineTo(xold,yold);}p D C ->MoveTo(xnew,ynew);
xold=xnew;

if(radio3->GetCheck()){

yold=ynew;}

sprintf(sData.command, "Z%d", counter);}sData.fv[0] = double(-1*n);//力センサー描画

sData.fv[1]=double(m_sm);

if(tikara==1){
y1=atoi(m_tuyox);sData.fv[2]=y2=atoi(m_tuyoy);double(m_fm);y3=atoi(m_tuyoz);

sock->SockWrite(sData);

tu=tu+1;

s p r i n t f ( dummy,"S
F %.0f mm/min Z 方向へ

%.3f

%.0f

rpm

ｍｍ動かします",sData.fv[1],sData.fv[2],sData.fv[0] );int x1,yx,yy,yz;
x1=tu;

m_message = dummy;

yx= y1+30;

UpdateData(false);

yy= y2+90;
yz= y3+150;}
CDC* pDC=m_pict.GetDC();}counter = 0;

CPen
BluePen,RedPen,GreenPen,BrackPen;

for (axis = 0; axis < AXIS_NU M;
axis++)

BluePen.CreatePen(PS_SOLID,1,RGB(0,0,255));
meanForce[axis] = 0.0;}

p D C ->SelectObject(&BluePen);}p D C ->MoveTo(ya,xa);//加工経路描画

p D C ->LineTo(yx,x1);

if(kakou==1){
ya=yx;
MappingModel=MM_HIMETRIC;
x1=atoi(m_macx);//CDC* pDC=m_pict.GetDC();y4=atoi(m_macy);x n e w = ( x 1-272)*10;
ynew=(y4+347)* -1*10;

RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));p D C ->SelectObject(&RedPen);p D C ->MoveTo(yb,xa);

CDC* pDC=m_pict.GetDC();p D C ->LineTo(yy,x1);

CPen RedPen;
yb=yy;
RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));//CDC* pDC=m_pict.GetDC();100}
GreenPen.CreatePen(PS_SOLID,1,RGB(0,255,0));UpdateData(false);p D C ->SelectObject(&GreenPen);}p D C ->MoveTo(yc,xa);
p D C ->LineTo(yz,x1);

CDialog::OnTimer(nIDEvent);}

yc=yz;
xa=x1;

void CMCOperDlg::OnExit()//x{if(tu>190){
CDC*pDC=m_pict.GetDC();// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

CRect myRECT;

if(StartFlag == true) {m_pict.GetClientRect(myRECT);

KillTimer(READTIMER_ID);//

pDC->FillSolidRect(myRECT,RGB(255,255,255));}//yCDialog::OnClose();/*PostMessage(WM_CLOSE, 0, 0);

CDC*pDC=m_pict.GetDC();
CRect myRECT;}m_pict.GetClientRect(myRECT);//Handle Mode Y+
pDC->FillSolidRect(myRECT,RGB(255,255,255));//z

void CMCOperDlg::OnNcsend8(){// TODO: この位置にコントロール通知ハン

CDC*pDC3=m_pict3.GetDC();

ドラ用のコードを追加してください

CRect myRECT3;m_pict3.GetClientRect(myRECT3);

sprintf(sData.command, "Y%d",counter);sData.fv[0] = double(1*n);pDC3->FillSolidRect(myRECT3,RGB(255,255,255));*///sData.fv[1] = double(m_sm);
sData.fv[2] = double(m_fm);

p D C ->SelectObject(&BrackPen);sock->SockWrite(sData);

p D C ->MoveTo(30,0);
p D C ->LineTo(30,190);

sprintf(dummy,"F %.0f mm/min Ｙ方
向へ

%.3f

ｍｍ動かします",sData.fv[2],sData.fv[0] );pDC ->MoveTo(90,0);m_message = dummy;

pDC ->LineTo(90,190);

UpdateData(false);

pDC ->MoveTo(150,0);}

pDC ->LineTo(150,190);
x1=0;//Handle Mode Y-

xa=0;

void CMCOperDlg::OnNcsend4()

ya=30; yb=90; yc=150;}{// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください/ / 変形センサー描画

sprintf(sData.command, "Y%d", counter);if(henkei==1){

sData.fv[0] = double(-1*n);//sData.fv[1] = double(m_sm);

101

sData.fv[2] = double(m_fm);

ドラ用のコードを追加してください

sock->SockWrite(sData);
sprintf(dummy,"F %.0f mm/min Ｙ方向へ

sprintf(sData.command, "Z%d", counter);%.3f

ｍｍ動かします",sData.fv[2],sData.fv[0] );sData.fv[0] = double(1*n);//sData.fv[1] = double(m_sm);

m_message = dummy;sData.fv[2] = double(m_fm);

UpdateData(false);

sock->SockWrite(sData);}

sprintf(dummy,"F %.0f mm/min Z 方向へ%.3fｍｍ動かします",sData.fv[2],sData.fv[0] );//Handle Mode X+

m _ m e ssage = dummy;

void CMCOperDlg::OnNcsend5()

UpdateData(false);{}// TODO: この位置にコントロール通知ハン//Handle Mode Z-

ドラ用のコードを追加してください//

sprintf(sData.command, "X%d", counter);void CMCOperDlg::OnNcsend7()

sData.fv[0] = double(1*n);{sData.fv[1] = double(m_sm);// TODO: この位置にコントロール通知ハン

sData.fv[2] = double(m_fm);

ドラ用のコードを追加してください

sock->SockWrite(sData);
sprintf(dummy,"F %.0f mm/min X 方向へ

sprintf(sData.command, "Z%d", counter);%.3f

ｍｍ動かします",sData.fv[2],sData.fv[0] );sData.fv[0] = double(-1*n);//m_message = dummy;sData.fv[1] = double(m_sm);
sData.fv[2] = do uble(m_fm);

UpdateData(false);

sock->SockWrite(sData);}

sprintf(dummy,"F %.0f mm/min Z 方向へ%.3fｍｍ動かします",sData.fv[2],sData.fv[0] );m_message = dummy;//Handle Mode X-

UpdateData(false);

void CMCOperDlg::OnNcsend6()}{// TODO: この位置にコントロール通知ハン

void CMCOperDlg::OnRadio1(){

ドラ用のコードを追加してください
sprintf(sData.command, "X%d", counter);sData.fv[0] = double(-1*n);//// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

sData.fv[1] = double(m_sm);

n=0.001;

sData.fv[2] = double(m_fm);
sock->SockWrite(sData);
sprintf(dummy,"F %.0f mm/min X 方向へ}%.3f

ｍｍ動かします",sData.fv[2],sData.fv[0] );m_message = dummy;

void CMCOperDlg::OnRadio2(){

UpdateData(false);}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください
n=0.01;//Handle Mode Z+
void CMCOperDlg::OnNcsend3()}{// TODO: この位置にコントロール通知ハン

void CMCOperDlg::OnRadio3()

102

{

void CMCOperDlg::OnButton2()// TODO: この位置にコントロール通知ハン{// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください
n=0.1;

ドラ用のコードを追加してください
sprintf(sData.command,

}

"B

dnc

end%d", counter);m_message="DNC 運転を終了//DNC Start Button

します";void CMCOperDlg::OnButton1()

sock->SockWrite(sData);{// TODO: この位置にコントロール通知ハン

m_dncstart.EnableWindow(TRUE);

ドラ用のコードを追加してください
sprintf(sData.command,

"A

dnc

m_dncend.EnableWindow(FALSE);

start %d", counter);m_yp.EnableWindow(FALSE);
m_message="DNC運転をスター

m_xp.EnableWindow(FALSE);
m_zp.EnableWindow(FALSE);

トします";
sock->SockWrite(sData);

m_xm.EnableWindow(FALSE);
m_ym.EnableWindow(FALSE);

m_dncstart.EnableWindow(FALSE);

m_zm.EnableWindow(FALSE);

m_dncend.EnableWindow(TRUE);

m_spinstart.EnableWindow(FALSE);
m_spinstop.EnableWindow(FALSE);

m_spinstart.EnableWindow(TRUE);//

m_yp.EnableWindow(TRUE);//

m_xp.EnableWindow(TRUE);

UpdateData(false);}// m_zp.EnableWindow(TRUE);// m_xm.EnableWindow(TRUE);

void CMCOperDlg::OnChangeEdit1()// m_ym.EnableWindow(TRUE);{// m_zm.EnableWindow(TRUE);
CButton*radio1// TODO: これが RICHEDIT コントロール=(CButton*)GetDlgItem(IDC_RADIO1);// 内での論理和の ENM_CHANGE フラグ

radio1->SetCheck(1);CButton*radio2付きで CRichEditCrtl().SetEventMask()=(CButton*)GetDlgItem(IDC_RADIO2);
radio3(CButton*)GetDlgItem(IDC_RADIO3);
radio3->SetCheck(0);n=0.001;m_sm = 500;}// メッセージをコントロールへ送るために
CDialog::OnInitDialog() 関数をオーバー

radio2->SetCheck(0);CButton*の場合、コントロールは、 lParam マスク// ライドしない限りこの通知を送りません。
=// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください
CEdit*

m_fm = 100;char count[10];UpdateData(false);

int mm;mm=str->GetLine(0,count,10);count[mm]=0;//DNC Stop Button

str=(CEdit*)GetDlgItem(IDC_EDIT1);

m_sm=atoi(count);

103

UpdateData(false);

pDC->MoveTo(87,y);}pDC->LineTo(92,y);}void CMCOperDlg::OnChangeEdit2()

for(y=60;y<=180;y=y+60){{// TODO: これが RICHEDIT コントロール

pDC->MoveTo(147,y);の場合、コントロールは、 lParam マスク

pDC->LineTo(152,y);// 内での論理和の ENM_CHANGE フラグ}

付きで CRichEditCrtl().SetEventMask()

tu=0;// メッセージをコントロールへ送るために

xa=0;

CDialog::OnInitDialog() 関数をオーバー

ya=30; yb=90; yc=150;// ライドしない限りこの通知を送りません。

u=1;}else if(a1==1){// TODO: この位置にコントロール通知ハン

x1=atoi(m_macx);y4=atoi(m_macy);

ドラ用のコードを追加してください
CEdit*

str

xnew=x1-272;=(CEdit*)GetDlgItem(IDC_EDIT2);

ynew=y4+347;

char data[10];CWnd*

int m;

h=GetDlgItem(IDC_PICT);

m=str->GetLine(0,data,10);

CDC* pDC=m_pict.GetDC();data[m]=0;

CPen RedPen;

m_fm=atoi(data);
UpdateData(false);

RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));}p D C ->SelectObject(&RedPen);p D C ->LineTo(xnew,ynew);void CMCOperDlg::OnForcebutton1()

p D C ->MoveTo(xold,yold);{xold=xnew;
yold=ynew;/*m_stop.EnableWindow(TRUE);

u=2;

m_foce.EnableWindow(FALSE);}

if(a1==3){

else if(a1==2){CWnd* h=GetDlgItem(IDC_PICT);

u=3;

CDC*pDC=h->GetDC();}*/pDC ->MoveTo(30,0);}

p D C ->LineTo(30,190);
p D C ->MoveTo(90,0);
p D C ->LineTo(90,190);

void CMCOperDlg::OnPcpgadInit()

p D C ->MoveTo(150,0);{

p D C ->LineTo(150,190);// TODO: この位置にコントロール通知ハン

int y;

ドラ用のコードを追加してください

for(y=60;y<=180;y=y+60){
pDC->MoveTo(27,y);pDC->LineTo(32,y);//--------------------------------------------------------------}// Pcpg46.Dll を開く

for(y=60;y<=180;y=y+60){//----------------------------------------------------------

104

-----

// 空きデバイス自動検索を指定
if ( FALSE == pcpg.Pcpg46wDllOpen() ) {

if

(

FALSE

==

pcpg.Pcpg46wCreate(&wBsn) ){pcpg.ErrorMessage(PCPG46_BSN_AUTO);
return ;// DLL のpcpg.ErrorMessage(PCPG46_BSN_AUTO);
return ;ロードまたはドライバのオープンに失敗しました}}//----------------------------------------------------------

wsprintf( szBuf,-----_T("PCPG46 Created¥n")// ＤＬＬバージョン情報の表示_T("BSN Number %d"), wBsn );//----------------------------------------------------------

pcpg.ResultMessage( szBuf );-----//---------------------------------------------------------if

(

FALSE

==

-----

pcpg.Pcpg46wGetLibVersion(bData)) {// リソース情報を表示//----------------------------------------------------------

pcpg.ErrorMessage(PCPG46_BSN_AUTO);-----

return ;

if

}

(

FALSE

==

pcpg.Pcpg46wGetResource(wBsn,&ri)){

wsprintf( szBuf,

pcpg.ErrorMessage(wBsn);_T("PCPG46¥n")return ;_T("Dll Version %s"),}bData );

wsprintf(szBuf, _T("Board Name: %s¥n")pcpg.ResultMessage( szBuf );//----------------------------------------------------------_T("IO Address : %04Xh-%04Xh¥n"),// ドライババージョン情報の表示

szPcpg46,----//--------------------------------------------------------------

ri.dwIOPortBase[1],ri.dwIOPortBase[1] +
if

(

FALSE

==

ri.dwIOPortLength[1] - 1 );pcpg.Pcpg46wGetDrvVersion(bData)) {pcpg.ResultMessage(szBuf);

pcpg.ErrorMessage(PCPG46_BSN_AUTO);
return ;/ / ---------------------------------------------------------------}// 第１軸を選択

wsprintf( szBuf,//----------------------------------------------------------_T("PCPG46¥n")-----_T("Drv Version %s"),

wAxis = PCPG46_AXIS_1;

bData );//----------------------------------------------------------

pcpg.ResultMessage( szBuf );-----//----------------------------------------------------------// 制御軸の初期化-----//---------------------------------------------------------// デバイスの使用を宣言する//-------------------------------------------------------------------if(FALSE

pcpg.Pcpg46_InitAxis(wBsn,wAxis)){wBsn = PCPG46_BSN_AUTO;

pcpg.ErrorMessage(wBsn);

==

105

return ;}newtonPerMst[0] = 1.0;

wsprintf( szBuf,

newtonPerMst[1] = 1.0;

_T("PCPG46¥n")

newtonPerMst[2] = 1.0;

_T("制御軸 %d を初期化しましfor (axis = 0; axis < AXIS_NUM; axis++) {た"), wAxis );for (index = 0; index < AXIS_NUM;

pcpg.ResultMessage( szBuf );index++) {hDeviceHandle = AdOpen("FBIAD1");
if(hDeviceHandle

newtonPerMstMatrix[axis][index] ===INVALID_HANDLE_VALUE){
MessageBox("Device

newtonPerMst[axis]*

nonIntfMatrix[axis][index];
FBIAD1}}は使用できません");}} /* SetMatrix() */else{
MessageBox("AD ボードオープ
ンしました");/* 0mst. での A/D の出力を測定する，
結果は adDataOrg}に格納 * /

SetMatrix();

void CMCOperDlg::GetOrgAD()

GetOrgAD();{

GetCalAD();
CalcMstPerBit();static int meani = 10;/* meani 回の平均を取る*/

CalcSensorNon();int mi, axis;

m_pcpgadInit.EnableWindow(FALSE);

int

tmpDataOrg[AXIS_NUM];// m_pcpgadClo se.EnableWindow(TRUE);/* tmpDataOrg の初期化 */m_joystickStart.EnableWindow(TRUE);//

for(axis = 0; axis < AXIS_NUM; axis++)tmpDataOrg[axis] = 0;

m_joystickStop.EnableWindow(TRUE);

wsprintf( szBuf,_T("PCPG46¥n")}_T("Balance Strain Amp. and
Hit Return"));/* 非干渉化行列のセット*/

pcpg.ResultMessage( szBuf );void CMCOperDlg::SetMatrix(){/* Sample the data from each axis of AD converter
int axis, index;*//* Calculate the sum of each axis */nonIntfMatrix[0][0] = 1.03371;

SmplChReq[0].ulChNo = 1;

nonIntfMatrix[0][1] = -0.725237;

SmplChReq[0].ulRange = AD_5V;

nonIntfMatrix[0][2] = 0.186736;

SmplChReq[1].ulChNo = 2;

nonIntfMatrix[1][0] = -0.148806;

SmplChReq[1].ulRange = AD_5V;

nonIntfMatrix[1][1] = 0.722155;

SmplChReq[2].ulChNo = 3;

nonIntfMatrix[1][2] = 0.012234;

SmplChReq[2].ulRange = AD_5V;

nonIntfMatrix[2][0] = 1.10853;
nonIntfMatrix[2][1] = -0.34993;
nonIntfMatrix[2][2] = -1.28004;

for (mi = 0; mi < meani; mi++) {AdInputAD(hDeviceHandle,

3,

106

AD_INPUT_SINGLE, &SmplChReq[0], &wSmpData);

SmplChReq[2].ulChNo = 3;

for (axis = 0; axis < AXIS_NUM;

SmplChReq[2].ulRange = AD_5V;

tmpDataOrg[axis]

for (mi = 0; mi < meani; mi++) {axis++)=

tmpDataOrg[axis] +(int)wSmpData[axis];

AdInputAD(hDeviceHandle,

Sleep(100);3,

AD_INPUT_SINGLE, &SmplChReq[0], &wSmpData);}for (axis = 0; axis < AXIS_NUM; axis++)/* Calculate the avarage of each axis and Print
them */

tmpDataCal[axis]=

tmpDataCal[axis] +(int)wSmpData[axis];for (axis = 0; axis < AXIS_NUM; axis++) {adDataOrg[axis]

Sleep(100);=}(int)(tmpDataOrg[axis] / meani);}for (axis = 0; axis < AXIS_NUM; axis++) {sprintf(dummy, "%d",adDataOrg[0]);m_fx=dummy;

adDataCal[axis]=(int)(tmpDataCal[axis] / meani);

sprintf(dummy, "%d",adDataOrg[1]);}m_fy=dummy;

sprintf(dummy, "%d",adDataCal[0]);sprintf(dummy, "%d",adDataOrg[2]);m_fx=dummy;

m_fz=dummy;

sprintf(dummy, "%d",adDataCal[1]);UpdateData(false);

m_fy=dummy;} /* GetOrgAD() */sprintf(dummy, "%d",adDataCal[2]);m_fz=dummy;
UpdateData(false);/* 100mst. で の A/D の 出 力 を 測 定 す る ， 結 果 は

wsprintf( szBuf,

adDataCal に格納*/_T("PCPG46¥n")void CMCOperDlg::GetCalAD()_T("Turn

{

off

Cal

and

Hit

return¥n"));static int meani = 10;/* meani 回の平均をpcpg.ResultMessage( szBuf );取る*/
int mi, axis;} /* GetCalAD() */int tmpDataCal[AXIS_NUM];/* tmpDataCal の初期化*//* calibration の結果より１ビット当たりの歪の計算*/

forvoid CMCOperDlg::CalcMstPerBit()(axis = 0; axis < AXIS_NUM; axis++)tmpDataCal[axis] = 0;{

wsprintf( szBuf,

int axis;_T("PCPG46¥n")_T("Turn on 100 micro strain
calibration switch and Hit Return"));/ * １ビット当たりの歪の計算(100ust の場合) */for (axis = 0; axis < AXIS_NUM; axis++) {pcpg.ResultMessage( szBuf );mstPerBit[axis]=

SmplChReq[0].ulChNo = 1;
SmplChReq[0].ulRange = AD_5V;
S m plChReq[1].ulChNo = 2;
SmplChReq[1].ulRange = AD_5V;(double)100.0/(adDataCal[axis]

adDataOrg[axis]);}sprintf(dummy, "%lf",mstPerBit[0]);m_fx=dummy;

-

107

sprintf(dummy, "%lf",mstPerBit[1]);//----------------------------------------------------------

m_fy=dummy;-----

sprintf(dummy, "%lf",mstPerBit[2]);// Pcpg46.Dll を閉じる

m_fz=dummy;//----------------------------------------------------------

UpdateData(false);----if ( FALSE == pcpg.Pcpg46wDllClose()) {} /* CalcMstPerBit() */pcpg.ErrorMessage(PCPG46_BSN_AUTO);/* newtonPerMstMatrix × mstPerBit = sensorNon を

return ;// DLL の計算する*/
void CMCOperDlg::CalcSensorNon()

アンロードに失敗しました{}
int axis, index;
m_pcpgadInit.EnableWindow(TRUE);/* 非干渉化行列×１ビット当たりの歪の計算*/

m_pcpgadClose.EnableWindow(FALSE);

for (axis = 0; axis < AXIS_NUM; axis++) {m_joystickStart.EnableWindow(FALSE);

for (index = 0; index < AXIS_NUM; index++) {m_joystickStop.EnableWindow(FALSE);

sensorNon[axis][index]=

newtonPerMstMatrix[axis][index]

return ;*mstPerBit[axis];}}}

void CMCOperDlg::OnJoystickStop()} /* CalcSensorNon() */{// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

void CMCOperDlg::OnPcpgadClose()//{

KillTimer(1);joystickStart = 0;// TODO: この位置にコントロール通知ハン

m_pcpgadInit.EnableWindow(FALSE);
m_pcpgadClose.EnableWindow(TRUE);

ドラ用のコードを追加してください

m_joystickStart.EnableWindow(TRUE);
AdClose(hDeviceHandle);m_joystickStop.EnableWindow(FALSE);//----------------------------------------------------------}// デバイスを解放する

void CMCOperDlg::OnJoystickStart()//----------------------------------------------------------

{

-----

-----

// TODO: この位置にコントロール通知ハン
if ( FALSE == pcpg.Pcpg46wClose(wBsn)){

ドラ用のコードを追加してください

pcpg.ErrorMessage(wBsn);
return ;int axis;}
wsprintf( szBuf,_T("PCPG46 Close¥n")_T("Bsn %d"), wBsn );pcpg.ResultMessage( szBuf );counter = 0;
for (axis = 0; axis < AXIS_NUM; axis++)meanForce[axis] = 0.0;
joystickStart = 1;

108// SetTimer(1,5,NULL);
m_pcpgadInit.EnableWindow(FALSE);

tikara=0;}

m_pcpgadClose.EnableWindow(FALSE);
m_joystickStart.EnableWindow(FALSE);

void CMCOperDlg::OnJoystickmode()m_joystickStop.EnableWindow(TRUE);{}// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

void CMCOperDlg::OnHandlemode()

m_handlemode = 0;{

m_pcpgadInit.EnableWindow(TRUE);// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください//
m_pcpgadClose.EnableWindow(TRUE);

m_handlemode = 1;
m_pcpgadInit.EnableWindow(FALSE);//
m_joystickStart.EnableWindow(TRUE);//

m_pcpgadClose.EnableWindow(FALSE);

m_joystickStop.EnableWindow(TRUE);
m_xp.EnableWindow(FALSE);

m_joystickStart.EnableWindow(FALSE);

m_yp.EnableWindow(FALSE);
m_zp.EnableWindow(FALSE);

m_joystickStop.EnableWindow(FALSE);

m _ xm.EnableWindow(FALSE);

m_xp.EnableWindow(TRUE);

m_ym.EnableWindow(FALSE);

m_yp.EnableWindow(TRUE);

m_zm.EnableWindow(FALSE);

m_zp.EnableWindow(TRUE);
m_xm.EnableWindow(TRUE);}

m_ym.EnableWindow(TRUE);
m_zm.EnableWin dow(TRUE);}

void CMCOperDlg::OnSPINDLESTOP(){// TODO: この位置にコントロール通知ハン

void CMCOperDlg::OnButton3()

ドラ用のコードを追加してください{

m_spinstart.EnableWindow(TRUE);// TODO: この位置にコントロール通知ハン

m_spinstop.EnableWindow(FALSE);
sprintf(sData.command, "L Spindle stop

ドラ用のコードを追加してくださいfrom client %d", counter);m_stop.EnableWindow(FALSE);

sock->SockWrite(sData);

m_henkei.EnableWindow(TRUE);

KillTimer(READTIMER_ID);m_kakou.EnableWindow(TRUE);
m_tikara.EnableWindow(TRUE);

m_message ="SPINDLE STOP";m_foce.EnableWindow(FALSE);
CDC*pDC=m_pict.GetDC();

UpdateData(false);}

CRect myRECT;m_pict.GetClientRect(myRECT);

void CMCOperDlg::OnSindleStart()

pDC->FillSolidRect(myRECT,RGB(255,255{,255));// TODO: この位置にコントロール通知ハン

henkei=0;
kakou=0;

ドラ用のコードを追加してください
m_spinstop.EnableWindow(TRUE);

109

m_spinstart.EnableWindow(FALSE);
sprintf(sData.command,"M

SPINDLESTART %d", counter);sData.fv[4] = double(0);}else if (m_C6 == TRUE){

sData.fv[0] = double(m_sm);

sData.fv[5] = double(1);sock->SockWrite(sData);}

KillTimer(READTIMER_ID);

else if (m_C6 == FALSE){
sData.fv[5] = double(0);m_message ="SPINDLE START";}

UpdateData(false);

else if (m_C7 == TRUE){}

sData.fv[6] = double(1);}void CMCOperDlg::OnCStart()

else if (m_C7 == FALSE){{

sData.fv[6] = double(0);// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください}
else if (m_C8 == TRUE){/*

sData.fv[7] = double(1);sprintf(sData.command, "a%d", counter);}

if(m_C1 == TRUE){

else if (m_C8 == FALSE){

sData.fv[0] = double(1);sData.fv[7] = double(0);}}else if (m_C1 == FALSE){

else if (m_C9 == TRUE){

sData.fv[0] = double(0);sData.fv[8]= double(1);}}else if (m_C2 == TRUE){

else if (m_C9 == FALSE){

sData.fv[1] = double(1);}sData.fv[8] = double(0);}else if (m_C2 == FALSE){

else if (m_C10 == TRUE){

sData.fv[1] = double(0);sData.fv[9] = double(1);}}else if (m_C3 == TRUE){

else if (m_C10 == FALSE){

sData.fv[2] = double(1);sData.fv[9] = double(0);}}else if (m_C3 == FALSE){

else if (m_C11 == TRUE){

sData.fv[2] = double(0);sData.fv[10] = double(1);}}else if (m_C4 == TRUE){

else if (m_C11 == FALSE){

sData.fv[3] = double(1);sData.fv[10] = double(0);}}else if (m_C4 == FALSE){

else if (m_C12 == TRUE){

sData.fv[3] = double(0);sData.fv[11] = double(1);}}else if (m_C5 == TRUE){

else if (m_C12 == FALSE){

sData.fv[4]= double(1);sData.fv[11] = double(0);}}else if (m_C5 == FALSE){

else if (m_C13 == TRUE){

110

sData.fv[12]= double(1);sData.fv[0] = double(0);}m_message ="側面前冷却ファン停止";

else if (m_C13 == FALSE){}

sData.fv[12] = double(0);else if (m_C2 == FALSE){}

m_C2 = TRUE;

else if (m_C14 == TRUE){

sData.fv[0] = double(1);sData.fv[13] = double(1);m_message ="側面前冷却ファン稼動";}
else if (m_C14 == FALSE){}

sData.fv[13] = double(0);sock->SockWrite(sData);}

KillTimer(READTIMER_ID);

sock->SockWrite(sData);

UpdateData(false);

KillTimer(READTIMER_ID);

sprintf(sData.command, "b");UpdateData(false);*/}}void CMCOperDlg::OnC3()

void CMCOperDlg::OnC1(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハンドラ用のドラ用のコードを追加してください
if(m_C3 == TRUE){

コードを追加してください

m_C3 = FALSE;
if(m_C1 == TRUE){

sData.fv[0] = double(0);m_C1 = FALSE;

m_message ="背面冷却ファン停止";

sData.fv[0] = double(0);}m_message ="前面冷却ファン停止";

else if (m_C3 == FALSE){

else if (m_C1 == FALSE){

sData.fv[0] = double(1);}m_C3 = TRUE;
m_C1 = TRUE;

m_message ="背面冷却ファン稼動";

sData.fv[0] = double(1);m_message ="前面冷却ファン稼動";}
sock->SockWrite(sData);}

KillTimer(READTIMER_ID);

sock->SockWrite(sData);

UpdateData(false);

KillTimer(READTIMER_ID);

sprintf(sData.command, "c");UpdateData(false);
sprintf(sData.command, "a");}}void CMCOperDlg::OnC4()
void CMCOperDlg::OnC2(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください
if(m_C2 == TRUE){
m_C2 = FALSE;

ドラ用のコードを追加してください
if(m_C4 == TRUE){
m_C4 = FALSE;
sData.fv[0] = double(0);111m_message ="ATC 側前冷却ファン停止";}}

else if (m_C6 == FALSE){

else if (m_C4 == FALSE){

m_C6 = TRUE;

m_C4 = TRUE;

sData.fv[0] = double(1);sData.fv[0] = double(1);m_message ="ATC 側後冷却ファン稼動";

m_message ="ATC 側前冷却ファン稼動";}}

sock->SockWrite(sData);

sock->SockWrite(sData);

KillTimer(READTIMER_ID);

KillTimer(READTIMER_ID);

UpdateData(false);

UpdateData(false);

sprintf(sData.command, "d");sprintf(sData.command, "f");}}void CMCOperDlg::OnCh1()
void CMCOperDlg::OnC5(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください
if(m_Ch1 == TRUE){

ドラ用のコードを追加してください
if(m_C5 == TRUE){

m_Ch1 = FALSE;

m_C5 = FALSE;

sData.fv[0] = double(0);sData.fv[0] = double(0);m_message ="前面左ヒーター停止";

m_message ="側面後冷却ファン停止";}}

else if (m_Ch1 == FALSE){

else if (m_C5 == FALSE){

m_Ch1 = TRUE;

m_C5 = TRUE;

sData.fv[0] = double(1);sData.fv[0] = double(1);m_message ="前面左ヒーター稼動";

m_message ="側面後冷却ファン稼動";}}

sock->SockWrite(sData);

sock->SockWrite(sData);

KillTimer(READTIMER_ID);

KillTimer(READTIMER_ID);

UpdateData(false);

UpdateData(false);

sprintf(sData.command, "g");sprintf(sData.command, "e");}}void CMCOperDlg::OnCh2()
void CMCOperDlg::OnC6(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

ドラ用のコードを追加してください
if(m_Ch2 == TRUE){

if(m_C6 == TRUE){

m_Ch2 = FALSE;

m_C6 = FALSE;

sData.fv[0] = double(0);sData.fv[0] = double(0);m_message ="ATC 側後冷却ファン停止";

m_message ="前面右ヒーター停止";}

112

else if (m_Ch2 == FALSE){

m_Ch4 = TRUE;

m_Ch2 = TRUE;

sData.fv[0] = double(1);sData.fv[0] = double(1);m_message ="背面右ヒーター稼動";

m_message ="前面右ヒーター稼動";}}

sock->SockWrite(sData);

sock->SockWrite(sData);

KillTimer(READTIMER_ID);

KillTimer(READTIMER_ID);

UpdateData(false);

UpdateData(false);

sprintf(sData.command, "j");sprintf(sData.command, "h");}}void CMCOperDlg::OnCh5()void CMCOperDlg::OnCh3(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください
if(m_Ch5 == TRUE){

ドラ用のコードを追加してください
if(m_Ch3 == TRUE){

m_Ch5 = FALSE;

m_Ch3 = FALSE;

sData.fv[0] = double(0);sData.fv[0] = double(0);m_message ="側面前ヒーター停止";

m_message ="背面左ヒーター停止";}}

else if (m_Ch5 == FALSE){

else if (m_Ch3 == FALSE){

m_Ch5 = TRUE;

m_Ch3 = TRUE;

sData.fv[0] = double(1);sData.fv[0] = double(1);m_me ssage ="側面前ヒーター稼動";

m_message ="背面左ヒーター稼動";}}

sock->SockWrite(sData);

sock->SockWrite(sData);

KillTimer(READTIMER_ID);

KillTimer(READTIMER_ID);

UpdateData(false);

UpdateData(false);

sprintf(sData.command, "k");sprintf(sData.command, "i");}}void CMCOperDlg::OnCh6()void CMCOperDlg::OnCh4(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください

ドラ用のコードを追加してください
if(m_Ch6 == TRUE){

if(m_Ch4 == TRUE){

m_Ch6 = FALSE;

m_Ch4 = FALSE;

sData.fv[0] = double(0);sData.fv[0] = double(0);m_message ="背面右ヒーター停止";}
else if (m_Ch4 == FALSE){

m_message ="側面後ヒーター停止";}
else if (m_Ch6 == FALSE){
m_Ch6 = TRUE;113

sData.fv[0] = double(1);m_message ="ATC 側後ヒーター稼動";

m_message ="側面後ヒーター稼動";}}

sock->SockWrite(sData);

sock->SockWrite(sData);

KillTimer(READTIMER_ID);

KillTimer(READTIMER_ID);

UpdateData(false);

UpdateData(false);

sprintf(sData.command, "n");sprintf(sData.command, "l");}}void CMCOperDlg::Onkakou()void CMCOperDlg::OnCh7(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください
kakou=1;

ドラ用のコードを追加してください
if(m_Ch7 == TRUE){

m_kakou.EnableWindow(FALSE);

m_Ch7 = FALSE;

m_henkei.EnableWindow(FALSE);

sData.fv[0] = double(0);m_tikara.EnableWindow(FALSE);

m_message ="ATC 側前ヒーター停止";}

m_stop.EnableWindow(TRUE);}

else if (m_Ch7 == FALSE){
m_Ch7 = TRUE;
sData.fv[0] = double(1);void CMCOperDlg::O nhenkei(){m_message ="ATC 側前ヒーター稼動";// TODO: この位置にコントロール通知ハン
ドラ用のコードを追加してください}
sock->SockWrite(sData);

m_kakou.EnableWindow(FALSE);

KillTimer(READTIMER_ID);m_henkei.EnableWindow(FALSE);

UpdateData(false);

m_tikara.EnableWindow(FALSE);

sprintf(sData.command, "m");m_stop.EnableWindow(TRUE);}}
void CMCOperDlg::Ontikara()
void CMCOperDlg::OnCh8(){{// TODO: この位置にコントロール通知ハン// TODO: この位置にコントロール通知ハン

ドラ用のコードを追加してください

ドラ用のコードを追加してください
if(m_Ch8 == TRUE){
m_Ch8 = FALSE;
sData.fv[0] = double(0);m_message ="ATC 側後ヒーター停止";

tikara=1;
m_kakou.EnableWindow(FALSE);
m_henkei.EnableWindow(FALSE);
m_tikara.EnableWindow(FALSE);}

m_stop.EnableWindow(TRUE);

else if (m_Ch8 == FALSE){

CWnd* h=GetDlgItem(IDC_PICT);

m_Ch8 = TRUE;
sData.fv[0] = double(1);CDC*pDC=h->GetDC();p D C ->MoveTo(30,0);

114

p D C ->LineTo(30,190);
p D C ->MoveTo(90,0);
p D C ->LineTo(90,190);
p D C ->MoveTo(150,0);
p D C ->LineTo(150,190);
int y;
for(y=60;y<=180;y=y+60){
pDC->MoveTo(27,y);pDC->LineTo(32,y);}for(y=60;y<=180;y=y+60){
pDC->MoveTo(87,y);pDC->LineTo(92,y);}for(y=60;y<=180;y=y+60){
pDC->MoveTo(147,y);pDC->LineTo(152,y);
}
tu=0;
xa=0;
ya=30; yb=90; yc=150;}