| 皆様、ご回答有難う御座います。長文になりますがとりあえずプログラム貼り付けます。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing.Drawing2D; using System.Windows.Forms;
namespace WindowsFormsApplication7 { public partial class Form1 : Form { //計算に使用する各パラメータを定義 float platenPCD01; float platenPCD02; float module; float gearINT; float gearSUN; float waferPCD; float waferPosition; float rpmUpper; float rpmLower; float rpmINT; float rpmSUN; float rpmWafer; float Theta;
public Form1() { InitializeComponent();
platenPCD01 = 1420; platenPCD02 = 430; module = 5; gearINT = 290; gearSUN = 80; waferPCD = 300; waferPosition = 150; rpmUpper = -10; rpmLower = 10; rpmINT = 30; rpmSUN = 10; rpmWafer = 0; float CRV = ((gearSUN * rpmSUN) + (gearINT * rpmINT)) / (gearSUN + gearINT); float CRO = ((((module * gearINT) / 2) * rpmINT) - (((module * gearSUN) / 2) * rpmSUN)) / ((module * gearINT - module * gearSUN) / 2); float Time = Theta / 36; double dThetaC = CRV / 60 * Math.PI * Time; float ThetaC = (float)dThetaC; }
private void numericUpDown1_ValueChanged(object sender, EventArgs e) { }
private void Form1_Paint(object sender, PaintEventArgs e) { platenPCD01 = 1420; platenPCD02 = 430; module = 5; gearINT = 290; gearSUN = 80; waferPCD = 300; waferPosition = 150; rpmUpper = -10; rpmLower = 10; rpmINT = 30; rpmSUN = 10; rpmWafer = 0;
float CRV = ((gearSUN * rpmSUN) + (gearINT * rpmINT)) / (gearSUN + gearINT); float CRO = ((((module * gearINT) / 2) * rpmINT) - (((module * gearSUN) / 2) * rpmSUN)) / ((module * gearINT - module * gearSUN) / 2);
float Time = Theta / 36;
double dThetaC = CRV / 120 * Math.PI * Time; float ThetaC = (float)dThetaC;
double dThetaW = CRO / 120 * Math.PI * Time; float ThetaW = (float)dThetaW;
double dThetaWW = (CRO + rpmWafer) / 120 * Math.PI * Time; float ThetaWW = (float)dThetaWW;
double dThetaL = rpmLower / 120 * Math.PI * Time; float ThetaL = (float)dThetaL;
double dThetaL0 = rpmLower / 120 * Math.PI * ((Theta - 1) / 36); float ThetaL0 = (float)dThetaL0;
double dWXC = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Cos(ThetaC) + waferPosition / 2 * Math.Cos(ThetaW); double dWYC = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Sin(ThetaC) + waferPosition / 2 * Math.Sin(ThetaW); float WXC, WYC; WXC = (float)dWXC; WYC = (float)dWYC;
double dThetaC0 = CRV / 120 * Math.PI * ((Theta - 1) / 36); float ThetaC0 = (float)dThetaC0; double dThetaW0 = CRO / 120 * Math.PI * ((Theta - 1) / 36); float ThetaW0 = (float)dThetaW0;
double dWXC0 = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Cos(ThetaC0) + waferPosition / 2 * Math.Cos(ThetaW0); double dWYC0 = ((module * gearSUN) / 2 + ((module * gearINT - module * gearSUN) / 4)) * Math.Sin(ThetaC0) + waferPosition / 2 * Math.Sin(ThetaW0); float WXC0, WYC0; WXC0 = (float)dWXC0; WYC0 = (float)dWYC0;
double dThetaWW0 = (CRO + rpmWafer) / 120 * Math.PI * ((Theta - 1) / 36); float ThetaWW0 = (float)dThetaWW0;
double dX150r0d = WXC + 150 * Math.Cos(ThetaWW + 0); double dY150r0d = WYC + 150 * Math.Sin(ThetaWW + 0); float X150r0d, Y150r0d; X150r0d = (float)dX150r0d; Y150r0d = (float)dY150r0d;
double dX150r0d0 = WXC0 + 150 * Math.Cos(ThetaWW0 + 0); double dY150r0d0 = WYC0 + 150 * Math.Sin(ThetaWW0 + 0); float X150r0d0, Y150r0d0; X150r0d0 = (float)dX150r0d0; Y150r0d0 = (float)dY150r0d0;
float VX150r0d = X150r0d - X150r0d0; float VY150r0d = Y150r0d - Y150r0d0;
double dR150r0d = Math.Sqrt((X150r0d * X150r0d) + (Y150r0d * Y150r0d)); float R150r0d; R150r0d = (float)dR150r0d;
float M; if (X150r0d < 0) { M = 180; } else if (X150r0d > 0 && Y150r0d < 0) { M = 360; } else { M = 0; }
double dT150r0d = Math.Atan(Y150r0d / X150r0d) * 180 / Math.PI + M; float T150r0d; T150r0d = (float)dT150r0d; double dVXP150r0d = (-R150r0d * (ThetaL)) * Math.Sin(T150r0d / 180 * Math.PI) - (-R150r0d * (ThetaL0)) * Math.Sin(T150r0d / 180 * Math.PI); float VXP150r0d, VYP150r0d; VXP150r0d = (float)dVXP150r0d; double dVYP150r0d = (R150r0d * (ThetaL)) * Math.Cos(T150r0d / 180 * Math.PI) - (R150r0d * (ThetaL0)) * Math.Cos(T150r0d / 180 * Math.PI); VYP150r0d = (float)dVYP150r0d; float VRX150r0d = VX150r0d - VXP150r0d; float VRY150r0d = VY150r0d - VYP150r0d; double dSR150r0d = (Math.Sqrt((VRX150r0d * VRX150r0d) + (VRY150r0d * VRY150r0d)));
if (R150r0d > platenPCD01 / 2 && R150r0d < platenPCD02 / 2) { dSR150r0d = 0; } float SR150r0d; SR150r0d = (float)dSR150r0d;
int SSSR150r0d; SSSR150r0d = (int)SR150r0d;
float SSR150r0d = 0; for (int d = 1; d <= Theta; d++) { SSR150r0d += SSSR150r0d; }
label35.Text = "移動量の総和: " + SSSR150r0d.ToString("F1"); label28.Text = "移動量: " + SSR150r0d.ToString("F1"); label30.Text = "Theta: " + Theta; }
private void hsbPhase_Scroll(object sender, ScrollEventArgs e) { Theta = hsbPhase.Value; Refresh(); }
private void btnAuto_Click(object sender, EventArgs e) { if (btnAuto.Text == "自動") { btnAuto.Text = "停止"; timer1.Interval = 1; timer1.Start(); } else { btnAuto.Text = "自動"; timer1.Stop(); } } private void timer1_Tick(object sender, EventArgs e) { if (hsbPhase.Value < hsbPhase.Maximum) { hsbPhase.Value += 1; } else { hsbPhase.Value = hsbPhase.Minimum; } Theta = hsbPhase.Value; Refresh(); } } }
計算を始めるボタンを設けて、ボタンを押すと変数 Theta が1ずつ増えていきます。Thetaの値はスクロールバーとも連動しています。
変数がたくさんありますが、Thetaの値が1ずつ増えていったときの SSSR150r0d の値を見てみると、
Theta が 100くらいまでは、SSSR150r0d の値は 9 という値になっていますが、その後、8・・・7・・・6・・・ と変化していきます。
SSR150r0d は SSSR150r0d の値の総和を見ていますが、なぜか 1200くらいまで増えていったときに、一旦 1000 に下がり、
また1100 まで増えると 1000 になったりと、変な挙動を示しております。
無理やりプログラムを貼り付けてしまってご迷惑おかけします。 |